web-dev-qa-db-fra.com

Comment se moquer d'un serveur Web pour des tests unitaires en Java?

Je voudrais créer un test unitaire à l'aide d'un faux serveur Web. Existe-t-il un serveur Web écrit en Java qui peut être facilement démarré et arrêté à partir d'un scénario de test JUnit?

38
jon077

Essayez Simple ( Maven ) c'est très facile à intégrer dans un test unitaire. Prenez le RoundTripTest et des exemples tels que le PostTest écrit avec Simple. Fournit un exemple de la façon d'intégrer le serveur dans votre scénario de test.

Simple est également beaucoup plus léger et plus rapide que Jetty, sans dépendances. Vous n'aurez donc pas à ajouter plusieurs fichiers jar sur votre chemin de classe. Vous n'aurez pas non plus à vous soucier de WEB-INF/web.xml ou tout autre artefact.

13
ng.

Wire Mock semble offrir un ensemble solide de talons et de maquettes pour tester les services Web externes.

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

Il peut également s'intégrer à Spock. Exemple trouvé ici .

30
keaplogik

Essayez-vous d'utiliser une maquette ou une intégrée serveur web?

Pour un serveur Web simulé , essayez d'utiliser Mockito , ou quelque chose de similaire, et simulez simplement le HttpServletRequest et HttpServletResponse objets comme:

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

Pour un serveur Web intégré , vous pouvez utiliser Jetty , que vous pouvez tiliser dans les tests .

20
CoverosGene

Vous pouvez également écrire une maquette avec la classe HttpServer du JDK (aucune dépendance externe requise). Voir ce billet de blog détaillant comment.

En résumé:

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

Une autre bonne alternative serait MockServer ; il fournit une interface fluide avec laquelle vous pouvez définir le comportement du serveur Web simulé.

7
Haroldo_OK

Vous pouvez essayer Jadler qui est une bibliothèque avec une programmation Java API Java pour stub et simuler les ressources http dans vos tests. Exemple:

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");
6
Jan Dudek

Si vous utilisez Apache HttpClient, ce sera une bonne alternative. HttpClientMock

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

Essayez d'utiliser le serveur Web Jetty .

3
flybywire
0
Okke Harsta