java - 使用 ServerSocket 类对方法进行单元测试的最佳方法是什么?

标签 java unit-testing junit mocking serversocket

我有这样一个方法:

public boolean isFree(LdapPort port) {
    boolean result = false;
    try{
        ServerSocket ss = new ServerSocket(port.getPortNumber());
        ss.getLocalPort();
        ss.close();
    } catch(IOException ex){
        result = true;
    }
    return result;
}

问题是,getLocalPort() 在真实系统端口上运行,并且在测试期间它是否通过取决于本地系统。

测试这种方法的有效方法应该是什么?

最佳答案

ServerSocket 实例应该可以通过工厂获得,(工厂)是passed as a dependency到你的类(class):

// Passing factory dependency via constructor injection
public PortChecker(IServerSocketFactory socketFactory)
{
    this.socketFactory = socketFactory;
}

// ...
ServerSocket ss = this.socketFactory.GetServerSocket(port.getPortNumber());
ss.getLocalPort();
ss.close();

然后,在你的单元测试中你可以mock socketFactory 返回假的 服务器套接字,并因此“断开”它与任何真实世界系统的连接。

请注意,ServerSocket 可能也需要抽象(例如,由接口(interface)/基类表示),以便它也可以被模拟。

关于java - 使用 ServerSocket 类对方法进行单元测试的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16511642/

相关文章:

java - 玩框架 2.1.x 和 EbeanServer

java - Spring StringTrimmerEditor 不工作

c# - 如何在 C# 单元测试中验证具有特定 NSpecification 参数的方法?

java - 空回复正文发帖放心

java - POI - Excel 不同 ID 的单独列

java - 如何在java中对具有多个数据排序的对象列表进行排序

java - 如何在 Gradle Android 插件中启用 processfork 进行单元测试

c# - 测试源与 2010 相比不可用

java - 在运行时动态添加 spring 上下文配置?

java - Eclipse:避免将某些依赖项包含在 JUnit 运行时类路径中