最佳实践:单元测试一个以Socket作为参数的方法?

时间:2012-04-28 19:46:10

标签: java unit-testing sockets

我试图对一类接受Socket对象读取和写入的方法进行单元测试。我想知道,最好的方法是什么?我在一个团队(这是一个大学项目)工作,我只负责这个(java)类,所以完全重构代码不是一个真正的选择。

是否有任何类型的模拟套接字可用,比如“Mocket”或其他东西?你会如何处理这个问题?

正如我所提到的,我是一名大学生,所以我期待着从论坛的智慧中学习。感谢您抽出宝贵时间回答。

3 个答案:

答案 0 :(得分:2)

为了使您的代码可测试,依赖于Socket的类应该依赖于套接字的抽象 - 例如,暴露您使用的方法的简单接口(如读取和写入)。您的应用程序将使用真实Socket类的包装器,但在单元测试中,您将能够使用mock(请检查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 :(得分:0)

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

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

之后创建一个实现接口的类。该类将包含一个Socket。

在您需要测试代码的类中,您将通过客户端的接口而不是具体的实现。通过这种方式: 1)您将能够交换系统的行为,而不会对您的测试类进行任何更改。 2)您将能够使用您需要的任何实现来模拟您的客户端,因此您将比使用套接字作为参数更容易地测试代码。

答案 2 :(得分:0)

所有好建议,谢谢!麻烦的是,我必须保留我给出的接口/ api,以免破坏自动编程器。

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

谢谢大家!