web-dev-qa-db-fra.com

Comment exécuter jetty server pour Java junit testing

J'essaie d'écrire un test d'intégration pour faire tourner localement le serveur de la jetée, puis j'utilise le client pour communiquer avec l'URI restant et appeler la logique métier en aval. Cependant, lorsque je démarre mon serveur de jetée, il ne renonce pas au contrôle, mon client n'est donc pas exécuté. J'ai donc utilisé le thread pour démarrer ma jetée dans un autre thread, cependant, le thread se termine avant mon appel client, il est dit que la connexion a été refusée. Toute approche que je peux adopter?

@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();
}
16

Ignorez la Runnable, ignorez la new Thread(runnable).start()

L'appel jettyServer.start() démarre le serveur sur son propre thread (ainsi que tous les autres threads dont le serveur a besoin.

Pour un exemple de base de junit et de jetée ...

@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();
}

Le @Before et @After les annotations junit peuvent également être utilisées. Cela démarrera le serveur avant chaque @Test et arrêtez le serveur après.

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));
    }
}

Pour la meilleure approche, vous pouvez également utiliser le @BeforeClass et @AfterClass techniques, ainsi que la liaison automatique à un port ouvert. Cela ne démarrera le serveur qu'une seule fois, par classe de test, exécutera tous les @Test méthodes, puis arrêtez le serveur une fois à la fin.

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