Question

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

Était-ce utile?

La solution

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

Simple est beaucoup plus léger et rapide que Jetty, sans dépendance. Ainsi, vous n’aurez pas à ajouter plusieurs fichiers jar sur votre chemin de classe. Vous ne devez pas non plus vous préoccuper de WEB-INF / web.xml ou de tout autre artefact.

Autres conseils

Wire Mock semble offrir un ensemble solide de talons et de simulacres pour le test de 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 .

Essayez-vous d'utiliser un fausse ou un incorporé serveur Web?

Pour un serveur Web simulé , essayez d'utiliser Mockito , ou quelque chose de similaire, et simulez les objets HttpServletRequest et HttpServletResponse tels que:

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 , qui vous pouvez utiliser dans les tests .

Vous pouvez également écrire une maquette avec la classe HttpServer du JDK (aucune dépendance externe n'est requise). Voir cet article 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);
}

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

Vous pouvez essayer Jadler , qui est une bibliothèque avec une API Java programmatique courante pour stub et se moquer des 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");

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

Essayez d’utiliser le serveur Web Jetty .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top