web-dev-qa-db-ja.com

Java junitテスト用にjettyサーバーを実行する方法

統合テストを作成して、突堤サーバーをローカルで起動し、クライアントを使用して残りの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));
    }
}
32
Joakim Erdfelt