2015-04-20 23 views
9

Sto provando a scrivere un test di integrazione per far ruotare localmente il server jetty e quindi utilizzare il client per comunicare con il resto dell'URI e richiamare la logica di business a valle. Tuttavia, quando avvio il mio server molo non rilascia il controllo, quindi il mio client non viene eseguito. Quindi ho usato il threading per avviare il mio molo in un thread diverso, tuttavia, il thread finisce prima della chiamata del mio client, dice che la connessione è stata rifiutata. Qualche approccio che posso prendere?Come eseguire il server jetty per il test java junit

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

Quale classe è 'JettyServer'? non esiste alcun metodo 'buildJettyServer' nella [documentazione di Jetty] (http://download.eclipse.org/jetty/stable-9/apidocs/) – durron597

+0

Sono stato implementato un JettyServer di classe finale che utilizza org.eclipse.jetty.server .Server per avviare il server di jetty. – LifeStartsAtHelloWorld

+0

Certo, ma il non sapere cosa fa questa classe rende più difficile per noi aiutarti. – durron597

risposta

19

Skip il Runnable, saltare la new Thread(runnable).start()

La chiamata jettyServer.start() avvia il server nel proprio thread (insieme a tutti gli altri fili che le esigenze di server.

Per un esempio di base JUnit e molo ...

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

Il @Before ePossono essere usate anche 10 annotazioni junit. Ciò avvierà il server prima di ogni @Test e interromperà il server.

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

Per l'approccio migliore, è anche possibile utilizzare le tecniche @BeforeClass e @AfterClass, insieme con auto-binding a una porta aperta. Ciò avvierà il server solo una volta, per Classe di test, eseguirà tutti i metodi @Test, quindi arresta il server una volta alla fine.

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

Ha funzionato quando ho spostato l'implementazione del mio server jetty all'interno del test di junit, come da tua risposta sopra. – LifeStartsAtHelloWorld

+0

Questo non è l'unico modo, è andato avanti e ne ha aggiunti altri 2. –

+0

Grazie mille. Ci proverò. – LifeStartsAtHelloWorld

Problemi correlati