我正在尝试模拟我的程序的各种运行测试,在 @Before
方法中设置 Jetty 服务器并在 @After
中关闭它>。
我的第一个测试将成功运行,但在以下测试中尝试 POST 数据时 com.sun.jersey.api.client.ClientHandlerException: java.net.SocketException: Software caused connection abort: recv failed
发生。有什么方法可以让我的服务器(和客户端?)在测试之间干净地关闭吗?
我的前后代码如下:
@Before
public void startServer() {
try {
server = new Server(8080);
ServletContextHandler root = new ServletContextHandler(server, "/ingest", ServletContextHandler.SESSIONS);
root.addServlet(new Servlet(), "/*");
server.start();
client = new Client();
client.setChunkedEncodingSize(16 * 1024);
FileInputStream stream = new FileInputStream(testFile);
try {
client.resource(uri).type(MediaType.APPLICATION_OCTET_STREAM).post(stream);
} catch (Exception e) {
e.printStackTrace();
} finally {
Closeables.closeQuietly(stream);
client.destroy();
}
} catch (Exception e) {
e.printStackTrace();
fail("Unexpected Exception when starting up server.");
}
}
@After
public void shutDown() {
if (output.exists()) {
output.delete();
}
try {
server.stop();
} catch (Exception e) {
e.printStackTrace();
}
}
最佳答案
测试场景的最佳做法是不要对端口进行硬编码。这只会在其他地方运行时导致冲突,尤其是在负载适中或项目种类繁多的 CI 系统上。
在 Jetty 9 中(6、7、8 中的想法相同)
_server = new Server();
_connector = new ServerConnector(_server);
_server.setConnectors(new Connector[] { _connector });
_server.start();
int port = _connector.getLocalPort();
关于java - 在 JUnit 测试之间启动和停止 Jetty 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11794405/