我试图对一类方法进行单元测试,这些方法接受他们读写的 Socket 对象。我想知道,最好的方法是什么?我在一个团队中工作(这是一个大学项目)并且只负责这个(java)类,所以完全重构代码并不是一个真正的选择。
是否有任何可用的模拟套接字,例如“Mocket”之类的?你会如何处理这个问题?
正如我所提到的,我是一名大学生,所以我期待着从论坛的智慧中学习。感谢您花时间回答。
我试图对一类方法进行单元测试,这些方法接受他们读写的 Socket 对象。我想知道,最好的方法是什么?我在一个团队中工作(这是一个大学项目)并且只负责这个(java)类,所以完全重构代码并不是一个真正的选择。
是否有任何可用的模拟套接字,例如“Mocket”之类的?你会如何处理这个问题?
正如我所提到的,我是一名大学生,所以我期待着从论坛的智慧中学习。感谢您花时间回答。
为了使您的代码可测试,依赖的类Socket
应该依赖于套接字的抽象——例如,公开您使用的方法(如读取和写入)的简单接口。您的应用程序将使用真实类的包装器Socket
,但在单元测试中您将能够使用模拟(请查看JMock)。
考虑:
public interface ISocket
{
byte[] read();
int write(byte[] content);
}
public class SocketWrapper : ISocket
{
// read and write methods simply delegate work to real socket
}
public class ClassToTest
{
private ISocket socket;
public ClassToTest(ISocket socket)
{
this.socket = socket;
}
}
现在在您的单元测试中,您可以创建模拟ISocket
并将其传递给ClassToTest
构造函数。这样,您就可以将单元测试与其依赖项隔离开来。
所有好的建议,谢谢!问题是,我必须保留给我的接口/api,以免破坏自动评分器。
我所做的只是继承 Socket 类(我最终调用了我的子类 Mocket),然后覆盖 getInputStream 和 getOutputStream 方法。这使我能够控制进出方法的数据流,并且足以进行测试。
感谢大家!
我认为您需要先声明套接字接口,例如:
public interface IClient{
bool connect(...);
bool disconnect(...);
bool sendData(...);
}
之后创建一个实现接口的类。此类将包含一个 Socket。
在您需要测试代码的类中,您将传递客户端的接口,而不是具体的实现。通过这种方式:1)您将能够交换系统的行为,而不会对您的测试类进行任何更改。2)您将能够使用您需要的任何实现来模拟您的客户端,因此您将比使用套接字作为参数更容易地测试代码。