統合テストを作成して、突堤サーバーをローカルで起動し、クライアントを使用して残りのURIと通信し、ビジネスロジックをダウンストリームで呼び出そうとしています。ただし、突堤サーバーを起動すると、コントロールが解放されないため、クライアントが実行されません。そのため、別のスレッドで突堤を開始するためにスレッドを使用しましたが、クライアントの呼び出しの前にスレッドが終了し、接続が拒否されたと表示されます。私が取ることができるアプローチはありますか?
@Test
public void testPerform() {
final JettyServer jettyServer = JettyServer.create();
jettyServer.buildJettyServer(ServletContextHandler.SESSIONS, "/", 8080, TestResource.class);
Runnable runnable = new Runnable()
{
@Override
public void run()
{
jettyServer.start();
}
};
new Thread(runnable).start();
final javax.ws.rs.client.Client client = ClientBuilder.newClient();
final Response response = client.target("http://localhost:8080/test").request().post(Entity.text(""));
jettyServer.stop();
}
Runnable
をスキップし、new Thread(runnable).start()
をスキップします
jettyServer.start()
を呼び出すと、サーバーが独自のスレッドで(サーバーが必要とする他のすべてのスレッドとともに)起動します。
Junitとjettyの基本的な例については...
@Test
public void testGet() throws Exception
{
// Create Server
Server server = new Server(8080);
ServletContextHandler context = new ServletContextHandler();
ServletHolder defaultServ = new ServletHolder("default", DefaultServlet.class);
defaultServ.setInitParameter("resourceBase",System.getProperty("user.dir"));
defaultServ.setInitParameter("dirAllowed","true");
context.addServlet(defaultServ,"/");
server.setHandler(context);
// Start Server
server.start();
// Test GET
HttpURLConnection http = (HttpURLConnection)new URL("http://localhost:8080/").openConnection();
http.connect();
assertThat("Response Code", http.getResponseCode(), is(HttpStatus.OK_200));
// Stop Server
server.stop();
}
@Before
および@After
junitアノテーションも使用できます。これにより、各@Test
の前にサーバーが起動し、後にサーバーが停止します。
package jetty;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import Java.net.HttpURLConnection;
import Java.net.URL;
import org.Eclipse.jetty.http.HttpStatus;
import org.Eclipse.jetty.server.Server;
import org.Eclipse.jetty.servlet.DefaultServlet;
import org.Eclipse.jetty.servlet.ServletContextHandler;
import org.Eclipse.jetty.servlet.ServletHolder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class JUnitBeforeAfterJettyTest
{
private Server server;
@Before
public void startJetty() throws Exception
{
// Create Server
server = new Server(8080);
ServletContextHandler context = new ServletContextHandler();
ServletHolder defaultServ = new ServletHolder("default", DefaultServlet.class);
defaultServ.setInitParameter("resourceBase",System.getProperty("user.dir"));
defaultServ.setInitParameter("dirAllowed","true");
context.addServlet(defaultServ,"/");
server.setHandler(context);
// Start Server
server.start();
}
@After
public void stopJetty()
{
try
{
server.stop();
}
catch (Exception e)
{
e.printStackTrace();
}
}
@Test
public void testGet() throws Exception
{
// Test GET
HttpURLConnection http = (HttpURLConnection)new URL("http://localhost:8080/").openConnection();
http.connect();
assertThat("Response Code", http.getResponseCode(), is(HttpStatus.OK_200));
}
}
最善の方法として、@BeforeClass
および@AfterClass
の手法と、開いているポートへの自動バインドを使用することもできます。これは、サーバーを1回だけ起動し、テストクラスごとに、すべての@Test
メソッドを実行してから、サーバーを最後に1回停止します。
package jetty;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import Java.net.HttpURLConnection;
import Java.net.URI;
import Java.net.URL;
import org.Eclipse.jetty.http.HttpStatus;
import org.Eclipse.jetty.server.Server;
import org.Eclipse.jetty.server.ServerConnector;
import org.Eclipse.jetty.servlet.DefaultServlet;
import org.Eclipse.jetty.servlet.ServletContextHandler;
import org.Eclipse.jetty.servlet.ServletHolder;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class JUnitBeforeAfterClassJettyTest
{
private static Server server;
private static URI serverUri;
@BeforeClass
public static void startJetty() throws Exception
{
// Create Server
server = new Server();
ServerConnector connector = new ServerConnector(server);
connector.setPort(0); // auto-bind to available port
server.addConnector(connector);
ServletContextHandler context = new ServletContextHandler();
ServletHolder defaultServ = new ServletHolder("default", DefaultServlet.class);
defaultServ.setInitParameter("resourceBase",System.getProperty("user.dir"));
defaultServ.setInitParameter("dirAllowed","true");
context.addServlet(defaultServ,"/");
server.setHandler(context);
// Start Server
server.start();
// Determine Base URI for Server
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 stopJetty()
{
try
{
server.stop();
}
catch (Exception e)
{
e.printStackTrace();
}
}
@Test
public void testGet() throws Exception
{
// Test GET
HttpURLConnection http = (HttpURLConnection) serverUri.resolve("/").toURL().openConnection();
http.connect();
assertThat("Response Code", http.getResponseCode(), is(HttpStatus.OK_200));
}
}