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?

¿Fue útil?

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 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top