在Unix上使用JerseyTest Grizzly Web Server的行为

时间:2011-05-19 07:33:22

标签: unix rest jersey junit4 grizzly

我们已经创建了一个测试套件,为了运行它,我们使用嵌入式Grizzly Web Server和JerseyTest框架。

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

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

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

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

P.S。我们还测试了使用netstat -a |的其他进程是否正在使用端口9998 grep 9998但没有找到使用该端口的其他进程。

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

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

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

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