在JUnit测试之间启动和停止Jetty服务器

Que*_*atl 9 java testing junit jetty jersey

我正在尝试模拟我的程序的各种运行的测试,在@Before方法中设置Jetty服务器并在一个方法中关闭它@After.

我的第一个测试将成功运行,但在尝试POST数据com.sun.jersey.api.client.ClientHandlerException: java.net.SocketException: Software caused connection abort: recv failed时会发生以下测试.有什么方法可以让我的服务器(和客户端?)在测试之间干净地关闭?

我的Before和After代码如下:

@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();
    }
}
Run Code Online (Sandbox Code Playgroud)

jes*_*ell 8

测试场景的最佳实践是不对端口进行硬编码.这只会导致在其他地方运行时发生冲突,特别是在具有中等负载或各种项目的CI系统上.

在码头9(同样的想法在6,7,8)

_server = new Server();
_connector = new ServerConnector(_server);  
_server.setConnectors(new Connector[] { _connector });
_server.start();
int port = _connector.getLocalPort();
Run Code Online (Sandbox Code Playgroud)