素早い回答:
行を削除しserver.join()
ます。その行は、サーバースレッドが停止するまでjunitスレッドを待機させます。単体テストには必要ありません。
長い答え:
私たち (jetty 開発者) が junit で jetty 組み込みサーバーを使用することについて学んだこと。
テスト メソッドが 1 つしかない場合、またはテスト メソッド間でサーバーを初期状態にしておく必要がある場合は、@Before
およびアノテーションを使用してサーバーを起動および停止します。@After
例 @Before / @After (Jetty 9.x):
public class MyTest
{
private Server server;
private URI serverUri;
@Before
public void startServer() throws Exception
{
this.server = new Server();
ServerConnector connector = new ServerConnector(server);
connector.setPort(0); // let connector pick an unused port #
server.addConnector(connector);
ServletContextHandler context = new ServletContextHandler();
context.setContextPath("/");
server.setHandler(context);
// Serve capture servlet
context.addServlet(new ServletHolder(new MyServlet()),"/my/*");
// Start Server
server.start();
String host = connector.getHost();
if (host == null)
{
host = "localhost";
}
int port = connector.getLocalPort();
this.serverUri = new URI(String.format("http://%s:%d/",host,port));
}
@After
public void stopServer()
{
try
{
server.stop();
}
catch (Exception e)
{
e.printStackTrace(System.err);
}
}
@Test
public void testMe()
{
// Issue request to server
URI requestUri = serverUri.resolve("/my/test");
// assert the response
}
}
この手法では、サーバーをポート 0 で開始します。これは、基になるスタックに空のポートを選択してリッスンを開始するように指示するマジック ナンバーです。次に、テスト ケースは、リッスンしているポート番号をサーバーに尋ね、serverUri
このテストの実行に適したフィールドを構築します。
この手法はうまく機能しますが、メソッドごとにサーバーを起動/停止します。
より良い手法として、@BeforeClass
および@AfterClass
アノテーションを使用して、テスト クラス全体に対してサーバーを 1 回起動/停止し、この起動されたサーバーに対してテスト クラス内のすべてのメソッドを実行します。
例 @BeforeClass / @AfterClass (Jetty 9.x):
public class MyTest
{
private static Server server;
private static URI serverUri;
@BeforeClass
public static void startServer() throws Exception
{
server = new Server();
ServerConnector connector = new ServerConnector(server);
connector.setPort(0); // let connector pick an unused port #
server.addConnector(connector);
ServletContextHandler context = new ServletContextHandler();
context.setContextPath("/");
server.setHandler(context);
// Serve capture servlet
context.addServlet(new ServletHolder(new MyServlet()),"/my/*");
// Start Server
server.start();
String host = connector.getHost();
if (host == null)
{
host = "localhost";
}
int port = connector.getLocalPort();
serverUri = new URI(String.format("http://%s:%d/",host,port));
}
@AfterClass
public static void stopServer()
{
try
{
server.stop();
}
catch (Exception e)
{
e.printStackTrace(System.err);
}
}
@Test
public void testMe()
{
// Issue request to server
URI requestUri = serverUri.resolve("/my/test");
// assert the response
}
}
見た目あまり変わらない?はい、変化は微妙です。 に@Before
なりました。start/stop メソッドは静的になりました。およびフィールドは静的になりました。@BeforeClass
@After
@AfterClass
server
serverUri
この手法は、同じサーバーにアクセスする多数のテスト メソッドがあり、それらの要求がサーバーの状態を変更しない場合に使用されます。これにより、各テスト メソッド間でサーバーを再作成しないだけで、テスト ケースの実行が高速化されます。