Me gustaría crear una prueba unitaria utilizando un servidor web simulado. ¿Hay un servidor web escrito en Java que pueda iniciarse y detenerse fácilmente desde un caso de prueba JUnit?¿Cómo burlarse de un servidor web para probar unidades en Java?
Respuesta
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.
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
¿Se acabó este proyecto? – kbolino
Intente utilizar el Jetty web server.
¿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.
Tener un vistazo a https://github.com/oharsta/priproba
Otra buena alternativa sería MockServer; proporciona una interfaz fluida con la que puede definir el comportamiento del servidor web simulado.
También el MockServer depende de Netty (no de Jetty). –
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.
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
¿Qué es testClient en el código que proporcionó? – gribo
@gribo Supongo que TestClient es tu instancia actual bajo prueba. – Stephan
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");
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
¿Podría pegar un resultado de la dependencia mvn: árbol aquí? Puede ser un choque de bibliotecas. –
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) –
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);
}
¿Hay alguna manera de afirmar si el 'HttpServer' recibió una solicitud? –
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.
- 1. Servidor web para probar en Linux
- 2. Función burlarse (para probar) en C?
- 3. Cómo probar unidades de rutas de producción en Apache Camel?
- 4. ¿Para burlarse o no para burlarse?
- 5. Implementando sesiones en un servidor web java?
- 6. java: cómo burlarse de Calendar.getInstance()?
- 7. Ejecutar Java en un servidor web
- 8. Burlarse de jQuery para probar el uso básico
- 9. La mejor manera de burlarse del servicio web de Java
- 10. ¿Comenzar a probar unidades en VS2010?
- 11. ¿Cómo probar una aplicación web?
- 12. La mejor herramienta para probar unidades en MySQL
- 13. Cómo probar el código de unidad con muy pocas unidades
- 14. Cómo forzar escrituras parciales para probar un servidor de red
- 15. Java SE - un pequeño programa de servidor web
- 16. ¿La mejor manera para probar unidades de proyectos MonoTouch?
- 17. ¿Cómo empezar a probar unidades en Xcode 4?
- 18. Unidades de cocina en Java
- 19. ¿Cómo creo pruebas de unidades flexibles?
- 20. Cómo implementar un conversor de unidades en java
- 21. Cómo burlarse de un aspecto
- 22. Burlarse de bloques estáticos en Java
- 23. ¿Cómo alojar un sitio web JSP en un servidor web?
- 24. ¿Cómo probar/simular conexiones simultáneas para un sitio web?
- 25. Buenos sitios web para probar webcrawler en
- 26. Cómo proteger un servidor web DE un servidor proxy inverso
- 27. SQL Server para probar en la web
- 28. Configurar y usar el servidor de maquetas de mongodb para pruebas de unidades
- 29. Cómo obtener un servidor web Jetty incrustado para volcar su código Java provisional para JSPs
- 30. El servidor web más pequeño de Java
La tarea se parece más a la creación de la prueba de integración, no a la prueba unitaria. –