0

我有一个测试给定端口是否可用的函数:

public static boolean isPortAvailable(int port) throws IOException {
        boolean isAvailable = false;
        ServerSocket serverSocket = null;
        if (isValidPort(port)) {

            try {
                serverSocket = new ServerSocket(port);
                isAvailable = true;
            } catch (IOException ignore) {
                isAvailable = false;
            } finally {
                if (serverSocket != null) {
                    serverSocket.close();

                }
                serverSocket = null;
            }

        }
        return isAvailable;
    }

我需要使用 junit 测试此方法的错误条件:

@Test
    public void testPortUnAvailable() throws IOException{
        int port = 49613 ;
        Assert.assertFalse(PortUtil.isPortAvailable(port));
    }

我应该如何强制端口号 49613 或任何其他端口不可用于测试?任何其他关于更好方法的建议都是最受欢迎的。

4

1 回答 1

1

创建一个绑定到任意空闲端口的 ServerSocket。如果端口当前被另一个应用程序使用,那么使用像 49613 这样的硬编码端口会使您的测试失败,而您通常对此没有太多控制权。使用动态分配的端口测试您的方法,然后关闭套接字:

ServerSocket ss = new ServerSocket(0);
try {
    Assert.assertFalse(PortUtil.isPortAvailable(ss.getLocalPort()));
}
finally {
    ss.close();
}

如果您的 isPortAvailable 方法检查 java.net.BindException 而不是任何 IOException 也可能会更好,因为其他 IOExceptions 可能意味着其他错误并且不一定端口已在使用中。

于 2013-01-24T11:28:03.323 回答