Comment simuler un serveur Web pour les tests unitaires en Java?
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?
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 .
Consultez https://github.com/oharsta/priproba