Servlets de pruebas unitarias

Tengo un montón de servlets ejecutándose bajo el contenedor de servlets de Tomcat. Me gustaría separar el código de prueba del código de producción, así que consideré usar un marco de prueba. JUnit está muy bien integrado en Eclipse, pero no logré que ejecutara servlets utilizando un servidor Tomcat en ejecución. ¿Podría recomendar un marco de prueba de unidades que admita la prueba de servlets de Tomcat? La integración de Eclipse es agradable pero no necesaria.

Echa un vistazo a ServletUnit , que es parte de HttpUnit. En pocas palabras, ServletUnit proporciona una biblioteca de simulacros y utilidades que puede usar en las pruebas ordinarias de JUnit para simular un contenedor de servlets y otros objetos relacionados con servlets, como los objetos de solicitud y respuesta. El enlace de arriba contiene ejemplos.

The Spring Framework tiene buenos objetos simulados preparados para varias clases de Servlet API:

http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/mock/web/package-summary.html

Bueno. Ignorando el bit ‘tomcat’ y la encoding del servlet, la mejor opción es crear simulaciones para la respuesta y solicitar objetos, y luego contarle lo que espera de él.

Entonces, para un DoPost vacío estándar y usando EasyMock , tendrás

public void testPost() { mockRequest = createMock(HttpServletRequest.class); mockResponse = createMock(HttpServletResponse.class); replay(mockRequest, mockResponse); myServlet.doPost(mockRequest, mockResponse); verify(mockRequest, mockResponse); } 

Luego comience a agregar código al doPost. Los simulacros fallarán porque no tienen expectativas, y luego puedes establecer las expectativas desde allí.

Tenga en cuenta que si desea usar EasyMock con clases, deberá usar la biblioteca de extensiones de clase EasyMock. Pero funcionará de la misma manera a partir de ese momento.

Separe las partes de ese código que tratan con las solicitudes HTTP y la respuesta de las partes que hacen la lógica de negocios o la manipulación de la base de datos. En la mayoría de los casos, esto producirá una architecture de tres niveles, con una capa de datos (para la base de datos / persistencia), capa de servicio (para la lógica de negocios) y una capa de presentación (para las solicitudes y respuestas HTTP).

  1. Puedes probar las primeras dos capas sin ningún tipo de servlet; será más fácil probarlo de esa manera.
  2. Puede probar la capa de presentación, como sugieren otros , utilizando objetos de respuesta y solicitud HTTP simulados.
  3. Finalmente, si crees que es realmente necesario, puedes hacer pruebas de integración utilizando también HtmlUnit o JWebUnit .

Para las pruebas “en el contenedor”, eche un vistazo a Cactus

Si desea poder realizar la prueba sin un contenedor en ejecución, puede simular sus componentes con sus propios objetos simulados (por ejemplo, con EasyMock ) o puede probar MockRunner que tiene Stubs “predefinidos” para probar servlets, jdbc-connections, etc.

Actualizado en febrero de 2018: OpenBrace Limited se ha cerrado y su producto ObMimic ya no es compatible.

Si desea una alternativa más nueva a ServletUnit para probar JUnit de Servlets, puede encontrar que la biblioteca ObMimic de mi empresa es útil. Está disponible de forma gratuita desde la página de descargas del sitio web.

Al igual que con ServletUnit, proporciona una biblioteca de clases que puede usar en pruebas JUnit o TestNG normales fuera de cualquier contenedor de servlets para simular la API de Servlet.

Sus objetos Servlet API tienen constructores sin argumentos, son totalmente configurables e inspeccionables para todos los datos y configuraciones relevantes de la API del Servlet, y proporcionan una simulación completa de todo el comportamiento especificado por el javadoc de la API Servlet. Para ayudar con las pruebas hay soporte para la grabación selectiva de las llamadas a la API Servlet, control sobre cualquier comportamiento dependiente del contenedor, verifica cualquier llamada ambigua (es decir, donde el comportamiento de la API Servlet no está completamente definido) y una simulación JNDI en memoria para cualquier código de servlet que se basa en búsquedas JNDI.

Para obtener detalles completos, código de ejemplo, guías de “cómo hacerlo”, Javadoc, etc., consulte el sitio web.