2009-03-03 6 views

Respuesta

11

Pruebe Simple (Maven) es muy fácil de integrar en una prueba unitaria. Tome 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 más rápido que Jetty, sin dependencias. Por lo tanto, no tendrá que agregar varios jar a su classpath. Tampoco tendrá que preocuparse por WEB-INF/web.xml o cualquier otro artefacto.

+2

Si bien es probable que lo que el usuario quería, este no es un servidor web "falso", es un servidor web real que se lanza dentro de la prueba unitaria.Por ejemplo, si se tomara el puerto, fallaría, por lo que no sería una verdadera simulación (es decir, tendría una dependencia externa del sistema). De acuerdo con la nomenclatura anterior de Martin Fowler ["Test Dobles"] (http://www.martinfowler.com/bliki/TestDouble.html), este es un "falso". Dicho eso, era ** exactamente ** lo que estaba buscando. – ArtB

+0

¿Se acabó este proyecto? – kbolino

18

¿Está intentando utilizar un servidor web mock or an embedded?

para un servidor web simulacro, trate de usar Mockito, o algo similar, y simplemente se burlan de los HttpServletRequest y HttpServletResponse objetos 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, podría utilizar Jetty, que puedes use in tests.

6

Otra buena alternativa sería MockServer; proporciona una interfaz fluida con la que puede definir el comportamiento del servidor web simulado.

+0

También el MockServer depende de Netty (no de Jetty). –

19

Wire Mock parece ofrecer un conjunto sólido de trozos y burlas 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)); 
} 

Se puede integrar con spock también. Ejemplo encontrado here.

+0

Esto funcionó muy bien para mí. El uso de wireMockConfig(). DynamicPort() lo hace más predecible en un entorno donde otros programas pueden usar el puerto. Ojalá fuera el predeterminado ya que casi me pierdo esta posibilidad y me salté esta gran biblioteca. – morten

+0

¿Qué es testClient en el código que proporcionó? – gribo

+0

@gribo Supongo que TestClient es tu instancia actual bajo prueba. – Stephan

5

Puede probar Jadler (http://jadler.net) que es una biblioteca con una API Java programática fluida para resguardar y burlarse de 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"); 
+0

Intenté usar Jadler, pero cada vez que intento llamar a 'initJadler()' recibo el error mencionado https://github.com/jadler-mocking/jadler/issues/107. ¿Alguna idea de lo que podría estar yendo mal? – tuk

+0

¿Podría pegar un resultado de la dependencia mvn: árbol aquí? Puede ser un choque de bibliotecas. –

+1

Por favor, lea mi respuesta en github.com/jadler-mocking/jadler/issues/107, el problema es causado por el choque de las versiones de Jetty (8 vs 9). Puede eliminar la dependencia de Jetty9 (si no es necesaria para la ejecución de prueba) o ejecutar Jadler sin la dependencia de Jetty (https://github.com/jadler-mocking/jadler/wiki/Using-the-Alternative-Stub-Server -Implementación) –

4

puede escribir una maqueta con la clase del JDK HttpServer también (sin dependencias externas requeridas). Vea this blog post 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); 
} 
+0

¿Hay alguna manera de afirmar si el 'HttpServer' recibió una solicitud? –

1

Si está utilizando HttpClient Apache, esta será una buena alternativa. HttpClientMock

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

revelación completa: yo soy el autor de la biblioteca.

Cuestiones relacionadas