有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java最佳实践:单元测试接受socket作为参数的方法?

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

有没有类似“Mocket”之类的模拟socket?你将如何处理这个问题

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


共 (3) 个答案

  1. # 1 楼答案

    为了使代码可测试,依赖于Socket的类应该依赖于套接字的抽象——例如,公开您使用的方法(如读写)的简单接口。您的应用程序将在realSocket类周围使用包装器,但在单元测试中,您将能够使用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的mock并将其传递给ClassToTest构造函数。这样,您就可以将单元测试与其依赖项隔离开来

  2. # 2 楼答案

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

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

    然后创建一个实现接口的类。此类将包含一个套接字

    在您需要测试代码的类中,您将传递客户端的接口,而不是具体的实现。这样: 1) 您将能够在测试类中不做任何更改的情况下交换系统的行为。 2) 您将能够使用所需的任何实现来模拟您的客户机,因此测试代码要比使用套接字作为参数容易得多

  3. # 3 楼答案

    所有好的建议,谢谢!问题是,我必须保留提供给我的接口/api,以免破坏自动加载器

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

    谢谢大家