¿Cómo simular un servidor web para la prueba de unidades en Java?
Pregunta
Me gustaría crear una prueba de unidad utilizando un servidor web simulado. ¿Existe un servidor web escrito en Java que se pueda iniciar y detener fácilmente desde un caso de prueba JUnit?
Solución
Pruebe Simple ( Maven ) es muy fácil de incrustar en una prueba unitaria. Tome el RoundTripTest y ejemplos como el PostTest escrito con Simple. Proporciona un ejemplo de cómo incrustar el servidor en su caso de prueba.
También Simple es mucho más ligero y rápido que Jetty, sin dependencias. Por lo tanto, no tendrá que agregar varios archivos jar en su classpath. Tampoco tendrá que preocuparse por WEB-INF / web.xml
o cualquier otro objeto.
Otros consejos
Wire Mock parece ofrecer un conjunto sólido de stubs y mock para probar servicios web externos.
@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));
}
También puede integrarse con spock. El ejemplo encontrado aquí .
¿Está intentando usar un simulacro o un incrustado servidor web?
Para un servidor web mock , intente usar Mockito , o algo similar, y simplemente se burlan de los objetos HttpServletRequest
y HttpServletResponse
como:
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());
Para un servidor web incrustado , puede utilizar Jetty , que puede utilizar en las pruebas .
También puede escribir un simulacro con la clase HttpServer
del JDK (no se requieren dependencias externas). Consulte esta publicación del blog detallando cómo.
En resumen:
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);
}
Otra buena alternativa sería MockServer ; proporciona una interfaz fluida con la que puede definir el comportamiento del servidor web simulado.
Puedes probar Jadler , que es una biblioteca con una API de Java programática fluida para Apunte y simule los recursos http en sus pruebas. Ejemplo:
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 está usando Apache HttpClient, esta será una buena alternativa. HttpClientMock
HttpClientMock httpClientMock = new httpClientMock()
HttpClientMock("http://example.com:8080");
httpClientMock.onGet("/login?user=john").doReturnJSON("{permission:1}");
Intente utilizar el servidor web Jetty .
Echa un vistazo a https://github.com/oharsta/priproba