我们已经创建了一个测试套件,为了运行它,我们使用嵌入式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但没有找到使用该端口的其他进程。
答案 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();
...
}
完成此操作后,一切都按预期工作。