2015-04-20 7 views
9

Ich versuche, einen Integrationstest zu schreiben, um Jetty-Server lokal zu drehen und dann Client verwenden, um mit dem Rest-URI zu kommunizieren und die Geschäftslogik downstream zu nennen. Wenn ich jedoch meinen Jetty-Server starte, gibt er das Steuerelement nicht auf, sodass mein Client nicht ausgeführt wird. Also habe ich Threading verwendet, um meine Anlegestelle in einem anderen Thread zu starten, jedoch endet der Thread vor meinem Clientanruf, es heißt Verbindung abgelehnt. Irgendeine Annäherung, die ich nehmen kann?Wie Jetty-Server für Java-Junit-Test ausführen

@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

Welche Klasse ist 'JettyServer'? Es gibt keine Methode 'buildJettyServer' in der [Jetty-Dokumentation] (http://download.eclipse.org/jetty/stable-9/apidocs/) – durron597

+0

Ich bin eine letzte Klasse JettyServer implementiert, die org.eclipse.jetty.server verwendet .Server, um den Anlegestegserver hochzufahren. – LifeStartsAtHelloWorld

+0

Sicher, aber wenn wir nicht wissen, was diese Klasse macht, wird es schwieriger für uns, Ihnen zu helfen. – durron597

Antwort

19

die Runnable überspringen, überspringen die new Thread(runnable).start()

Der Anruf jettyServer.start() startet den Server auf einem eigenen Thread (zusammen mit allen anderen Threads, die der Server benötigt.

Für ein grundlegendes Beispiel für junit und Steg ...

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

Die @Before und @After Junit-Annotationen können ebenfalls verwendet werden. Dadurch wird der Server vor jedem @Test gestartet und der Server danach gestoppt.

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

Für den besten Ansatz, können Sie auch die @BeforeClass und @AfterClass Techniken verwenden, zusammen mit Auto-Bindung an einen offenen Port. Dies startet den Server nur einmal pro Testklasse, führt alle @Test Methoden aus und stoppt dann den Server einmal am Ende.

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

Es funktionierte, als ich die Implementierung meines Anlegesteg-Servers in den Junit-Test verlagerte, wie in der obigen Antwort angegeben. – LifeStartsAtHelloWorld

+0

Das ist nicht der einzige Weg, ging voran und fügte 2 weitere für Sie hinzu. –

+0

Vielen Dank. Ich werde das versuchen. – LifeStartsAtHelloWorld