2009-03-03 15 views

Odpowiedz

11

Wypróbuj Simple (Maven) bardzo łatwo osadzić w teście jednostkowym. Wykonaj test RoundTripTest i przykłady, takie jak PostTest napisane za pomocą Simple. Podaje przykład umieszczenia serwera w teście.

Również Simple jest znacznie lżejszy i szybszy niż Jetty, bez zależności. Więc nie będziesz musiał dodawać kilku słoików do swojej ścieżki klas. Nie musisz też zajmować się WEB-INF/web.xml ani innymi artefaktami.

+2

Choć prawdopodobnie jest to, czego chciał użytkownik, nie jest to "fałszywy" serwer sieciowy, jest to rzeczywisty serwer sieciowy uruchamiany w ramach testu urządzenia.Na przykład, jeśli port zostałby zrobiony, to zawiedzie, więc nie jest to prawdziwa sztuczka (tj. Ma zewnętrzną zależność od systemu). Według nomenklatury Martina Fowlera ["Test Doubles"] (http://www.martinfowler.com/bliki/TestDouble.html) jest to "fałszywe". To powiedziawszy, było ** dokładnie ** to, czego szukałem. – ArtB

+0

Czy ten projekt przestał działać? – kbolino

18

Czy próbujesz użyć serwera WWW mock or an embedded?

Dla mock serwer WWW, spróbuj użyć Mockito, lub coś podobnego, i po prostu mock HttpServletRequest i HttpServletResponse obiektów, takich jak:

MyServlet servlet = new MyServlet(); 
HttpServletRequest mockRequest = mock(HttpServletRequest.class); 
HttpServletResponse mockResponse = mock(HttpServletResponse.class); 

StringWriter out = new StringWriter(); 
PrintWriter printOut = new PrintWriter(out); 
when(mockResponse.getWriter()).thenReturn(printOut); 

servlet.doGet(mockRequest, mockResponse); 

verify(mockResponse).setStatus(200); 
assertEquals("my content", out.toString()); 

Dla osadzone serwer WWW, można użyć Jetty, które możesz use in tests.

6

Innym dobrym rozwiązaniem byłoby MockServer; zapewnia płynny interfejs, dzięki któremu można zdefiniować zachowanie wyśmiewanego serwera WWW.

+0

Również MockServer zależy od Netty (nie Jetty). –

19

Wire Mock wydaje się oferować solidny zestaw kodów pośrednich i próbnych do testowania zewnętrznych usług internetowych.

@Rule 
public WireMockRule wireMockRule = new WireMockRule(8089); 


@Test 
public void exactUrlOnly() { 
    stubFor(get(urlEqualTo("/some/thing")) 
      .willReturn(aResponse() 
       .withHeader("Content-Type", "text/plain") 
       .withBody("Hello world!"))); 

    assertThat(testClient.get("/some/thing").statusCode(), is(200)); 
    assertThat(testClient.get("/some/thing/else").statusCode(), is(404)); 
} 

Może również zintegrować ze spockiem. Znaleziono przykład here.

+0

To zadziałało bardzo dobrze dla mnie. Korzystanie z metody wireMockConfig(). DynamicPort() sprawia, że ​​jest bardziej przewidywalny w ustawieniach, w których inne programy mogą korzystać z portu. Szkoda, że ​​to nie było domyślne, bo prawie przegapiłem tę możliwość i pominąłem tę wspaniałą bibliotekę. – morten

+0

Co to jest testClient w podanym kodzie? – gribo

+0

@gribo Przypuszczam, że testClient jest Twoją rzeczywistą instancją podczas testu. – Stephan

5

Możesz wypróbować Jadler (http://jadler.net), który jest biblioteką z płynnym, programistycznym interfejsem API języka Java, służącym do pośredniczenia i próbkowania zasobów HTTP w testach. Przykład:

onRequest() 
    .havingMethodEqualTo("GET") 
    .havingPathEqualTo("/accounts/1") 
    .havingBody(isEmptyOrNullString()) 
    .havingHeaderEqualTo("Accept", "application/json") 
.respond() 
    .withDelay(2, SECONDS) 
    .withStatus(200) 
    .withBody("{\\"account\\":{\\"id\\" : 1}}") 
    .withEncoding(Charset.forName("UTF-8")) 
    .withContentType("application/json; charset=UTF-8"); 
+0

Próbowałem używać Jadler, ale gdy próbuję wywołać 'initJadler()' otrzymuję błąd jak wspomniano https://github.com/jadler-mocking/jadler/issues/107. Jakieś myśli, co może pójść źle? – tuk

+0

Czy możesz wkleić wynik zależności mvn: drzewo tutaj? Może to być zderzenie bibliotek. –

+1

Proszę przeczytać moją odpowiedź na github.com/jadler-mocking/jadler/issues/107, problem jest spowodowany zderzeniem wersji Jetty (8 vs 9). Możesz albo usunąć zależność Jetty9 (jeśli nie jest to konieczne do uruchomienia testu) lub uruchomić Jadler bez zależności Jetty9 (https://github.com/jadler-mocking/jadler/wiki/Using-the-Alternative-Stub-Server -Ustawienie) –

4

Można napisać makiety z HttpServer klasy JDK, jak również (wymagane żadne zależności zewnętrzne). Zobacz: this blog post opisujące sposób.

Podsumowując:

HttpServer httpServer = HttpServer.create(new InetSocketAddress(8000), 0); 
httpServer.createContext("/api/endpoint", new HttpHandler() { 
    public void handle(HttpExchange exchange) throws IOException { 
     byte[] response = "{\"success\": true}".getBytes(); 
     exchange.sendResponseHeaders(HttpURLConnection.HTTP_OK, response.length); 
     exchange.getResponseBody().write(response); 
     exchange.close(); 
    } 
}); 
httpServer.start(); 

try { 
// Do your work... 
} finally { 
    httpServer.stop(0); 
} 
+0

Czy istnieje sposób potwierdzenia, czy 'HttpServer' otrzymał żądanie? –

1

Jeśli używasz apache httpclient, to będzie dobrą alternatywą. HttpClientMock

HttpClientMock httpClientMock = new httpClientMock() 
HttpClientMock("http://example.com:8080"); 
httpClientMock.onGet("/login?user=john").doReturnJSON("{permission:1}"); 

Pełne ujawnienie: Jestem autorem biblioteki.