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

mav*_*ckm 3 unix rest jersey junit4 grizzly

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

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

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

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

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

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

mmo*_*sen 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);
}
Run Code Online (Sandbox Code Playgroud)