2012-04-28 94 views
1

我试图单元测试一个接受它们都读写的Socket对象的方法。我想知道,最好的方法是什么?我在一个团队(这是一个大学项目)工作,只负责这个(java)类,所以完全重构代码并不是真正的选择。最佳实践:单元测试一个将Socket作为参数的方法?

是否有任何类型的模拟插座可用,如“Mocket”或什么?你会如何解决这个问题?

正如我所说,我是一名大学生,所以我期待着从论坛的智慧中学习。感谢您花时间回答。

+1

是的,模拟插座。 – 2012-04-28 19:47:38

+0

MДΓΓБДLL,我该怎么做?你介意发布一个链接? – Plastech 2012-04-28 19:49:30

回答

2

为了让您的代码可测试,依赖于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构造函数。通过这种方式,您可以将单元测试与其依赖关系分离。

+0

+1,但在我看来,接口应该是客户端,而不是套接字,这将在这段代码中提供更多的抽象。 – AlexTheo 2012-04-28 20:13:59

0

我认为你需要首先声明套接字接口,如:

public interface IClient{ 
bool connect(...); 
bool disconnect(...); 
bool sendData(...); 
} 

之后,创建它实现了接口的类。这个类将包含一个Socket。

在您需要测试代码的类中,您将传递客户端的接口而不是具体的实现。通过这种方式: 1)您将可以在您的测试课程中无需更改您的系统行为。 2)你将能够用你需要的任何实现来模拟你的客户端,所以你将比使用socket作为参数更容易测试代码。

0

所有好的建议,谢谢!麻烦的是,我不得不保留我给的接口/ api,以免破坏autograder。

我做的只是继承Socket类(我最终调用了我的子类Mocket),然后重写getInputStream和getOutputStream方法。这使我能够控制数据流入和流出方法,并且足以进行测试。

谢谢大家!

+0

使用该方法,您结束了在测试代码中使用真实的'Socket'创建依赖项。创建用于测试的'Mocket'类将依赖于'Socket'类,这是你不能测试的代码。 当你测试你的代码时,你必须保持界限,并保证你只测试你的代码,而不是别人的代码。 @jimmy_keen是一个很好的答案。 – 2014-12-24 00:43:07

相关问题