2015-04-20 2 views
9

Я пытаюсь написать интеграционный тест, чтобы развернуть сервер причала локально, а затем использовать клиент для связи с остальным URI и вызвать бизнес-логику вниз по течению. Однако, когда я запускаю свой сервер приставок, он не отказывается от элемента управления, поэтому мой клиент не выполняется. Поэтому я использовал потоки, чтобы запустить мой причал в другом потоке, однако поток заканчивается перед вызовом моего клиента, он говорит, что соединение отклонено. Любой подход, который я могу предпринять?Как запустить сервер причала для тестирования 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

Какой класс 'JettyServer'? в документации [Jetty documentation] нет метода 'buildJettyServer' (http://download.eclipse.org/jetty/stable-9/apidocs/) – durron597

+0

Я внедряю последний класс JettyServer, который использует org.eclipse.jetty.server .Server для вращения сервера причала. – LifeStartsAtHelloWorld

+0

Конечно, но не зная, что делает этот класс, нам становится труднее помочь вам. – durron597

ответ

19

Пропустить Runnable, пропустить new Thread(runnable).start()

Вызов jettyServer.start() запускает сервер на своем собственном потоке (наряду со всеми другими потоками, что сервер должен.

Для базового примера JUnit и причал ...

@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 иТакже могут использоваться 10 аннотажей юнита. Это запустит сервер перед каждым @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 методы, наряду с автоматической привязкой к открытому порту. Это только запустит сервер один раз, для каждого тестового класса, запустит все методы @Test, а затем остановит сервер один раз в конце.

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

Это сработало, когда я переместил реализацию моего сервера причала внутри теста junit в соответствии с вашим ответом выше. – LifeStartsAtHelloWorld

+0

Это не единственный способ, пошел вперед и добавил еще 2 для вас. –

+0

Большое спасибо. Я попробую это. – LifeStartsAtHelloWorld

Смежные вопросы