我试图单元测试一个接受它们都读写的Socket对象的方法。我想知道,最好的方法是什么?我在一个团队(这是一个大学项目)工作,只负责这个(java)类,所以完全重构代码并不是真正的选择。最佳实践:单元测试一个将Socket作为参数的方法?
是否有任何类型的模拟插座可用,如“Mocket”或什么?你会如何解决这个问题?
正如我所说,我是一名大学生,所以我期待着从论坛的智慧中学习。感谢您花时间回答。
我试图单元测试一个接受它们都读写的Socket对象的方法。我想知道,最好的方法是什么?我在一个团队(这是一个大学项目)工作,只负责这个(java)类,所以完全重构代码并不是真正的选择。最佳实践:单元测试一个将Socket作为参数的方法?
是否有任何类型的模拟插座可用,如“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
构造函数。通过这种方式,您可以将单元测试与其依赖关系分离。
+1,但在我看来,接口应该是客户端,而不是套接字,这将在这段代码中提供更多的抽象。 – AlexTheo 2012-04-28 20:13:59
我认为你需要首先声明套接字接口,如:
public interface IClient{
bool connect(...);
bool disconnect(...);
bool sendData(...);
}
之后,创建它实现了接口的类。这个类将包含一个Socket。
在您需要测试代码的类中,您将传递客户端的接口而不是具体的实现。通过这种方式: 1)您将可以在您的测试课程中无需更改您的系统行为。 2)你将能够用你需要的任何实现来模拟你的客户端,所以你将比使用socket作为参数更容易测试代码。
所有好的建议,谢谢!麻烦的是,我不得不保留我给的接口/ api,以免破坏autograder。
我做的只是继承Socket类(我最终调用了我的子类Mocket),然后重写getInputStream和getOutputStream方法。这使我能够控制数据流入和流出方法,并且足以进行测试。
谢谢大家!
使用该方法,您结束了在测试代码中使用真实的'Socket'创建依赖项。创建用于测试的'Mocket'类将依赖于'Socket'类,这是你不能测试的代码。 当你测试你的代码时,你必须保持界限,并保证你只测试你的代码,而不是别人的代码。 @jimmy_keen是一个很好的答案。 – 2014-12-24 00:43:07
是的,模拟插座。 – 2012-04-28 19:47:38
MДΓΓБДLL,我该怎么做?你介意发布一个链接? – Plastech 2012-04-28 19:49:30