3

我们创建了一个测试套件,为了运行它,我们使用了带有 JerseyTest 框架的嵌入式 Grizzly Web 服务器。

我们从 JerseyTest 扩展了一个自定义类,在它的构造函数中我们创建了 ApplicationDescriptor,然后调用超类 setupTestEnvironment(),它基本上启动了嵌入式 grizzly Web 服务器。

我们很少有测试用例扩展这个自定义类来直接启动 grizzly 服务器。但是,我们不会在代码中的任何地方停止这个嵌入式服务器。

测试用例在 Windows 上运行良好,但在 Unix 上失败,java.net.BindException 端口 9998 正在被另一个进程使用。

很明显,如果我们没有在代码中停止嵌入式 Web 服务器,这些测试也会在 Windows 上失败并出现类似的错误。它们如何在 Windows 上运行良好而在 unix 上失败。这与 Unix 如何产生线程或进程有关吗?

PS 我们还使用 netstat -a | 测试了端口 9998 是否被其他进程使用。grep 9998 但找不到使用该端口的其他进程。

4

2 回答 2

7

我有一个类似的问题,如果已经使用,我确实通过不使用默认端口来修复它。只需将以下代码添加到您的测试用例中:

@Override
protected int getPort(int defaultPort) {

    ServerSocket server = null;
    int port = -1;
    try {
        server = new ServerSocket(defaultPort);
        port = server.getLocalPort();
    } catch (IOException e) {
        // ignore
    } finally {
        if (server != null) {
            try {
                server.close();
            } catch (IOException e) {
                // ignore
            }
        }
    }
    if ((port != -1) || (defaultPort == 0)) {
        return port;
    }
    return getPort(0);
}
于 2011-07-18T17:04:55.073 回答
1

当我编写集成测试时,我遇到了同样的问题。我没有在 Windows 机器上进行测试,但在我的 Unix 机器上我发现问题是默认情况下 JerseyTest 类使用@After它的tearDown方法来关闭嵌入式服务器。由于我已经覆盖了这种方法来进行清理,所以我不得不打电话super.tearDown()

@After
public void tearDown() throws Exception{
    super.tearDown();
    ...
}

完成此操作后,一切都按预期工作。

于 2015-06-26T17:15:22.173 回答