ventajas unitarias sistema que pruebas mock integracion ejemplo desventajas mocking integration-testing mockito

mocking - unitarias - Burlarse de las pruebas de integración



pruebas de sistema (3)

Gran pregunta

Parece que alcanzas los límites de Mockito. Mockito es genial si lo que quieres es inspeccionar las interacciones entre objetos.

Lo que quiere, sin embargo, parece ser la observabilidad (y capacidad de control) en un nivel superior de abstracción. Me temo que los simulacros o trozos que necesita para eso deben ser cuidadosamente diseñados y hechos a mano.

A nivel de unidad, estos simulacros se pueden generar muy bien, por medio de Mockito. En el nivel de integración, esto se vuelve mucho más difícil, y necesitará interfaces de comprobación de objetivos específicos.

¿Cómo se burla una de las muchas dependencias necesarias para las pruebas de integración?

Uso Mockito para mis pruebas de unidad ''pura''. ''Pure'' en este caso significa probar una sola clase, burlarse de todas sus dependencias. Hermosa.

Ahora vienen las pruebas de integración. Digamos que en este caso una prueba de integración probará algo como esto:

  1. El mensaje se pone en una cola
  2. El mensaje es ''procesado''
  3. El mensaje de respuesta se coloca en una cola de respuesta

Digamos también que el procesamiento que ocurre en el paso 2 es algo serio. Se basa en muchas interacciones de bases de datos, en múltiples servicios externos, el sistema de archivos, todo tipo de cosas. También hay muchos efectos secundarios que provocarán el flujo, por lo que no puedo simplemente asegurarme de que la respuesta sea correcta, necesito verificar los efectos secundarios.

Cada una de estas dependencias está envuelta por una única clase de servicio sin estado, lo que las hace agradables y burlables.

¿Cómo están las personas manejando esto?

Me encantaría usar Mockito para poder verificar los efectos secundarios que tendrá el flujo anterior. Sin embargo, la documentación de Mocktio (y en gran medida su implementación) parece luchar enérgicamente contra su uso en contextos distintos a las pruebas unitarias "puras". He intentado seguir esta ruta, pero

  • Es difícil completar los datos del código auxiliar (ya que hay muchos)
  • Es difícil que Spring inyecte esas instancias repetidas en mis granos
  • Es difícil ''reiniciar'' los simulacros para poder verificar un conjunto diferente de interacciones sin borrar los talones.

EDITAR

Sé que podría manejar el problema de la base de datos con algo así como una instancia de HSQLDB, pero aún existe la cuestión de los servicios externos. Para la repetibilidad no puedo confiar en que esos servicios estén funcionando, estar en el estado que requiero, etc. La única opción que veo es burlarse de ellos.

¿Qué hace Dada?


Si hay algún marco de simulación http o resto, usar eso debería ser bueno.

Todas las dependencias complicadas se pueden grabar, modificar y reproducir.


Para simular cosas como bases de datos, servicios web, el sistema de archivos, etc., es probable que desee refactorizar un poco. Para cada servicio externo, debe escribir una clase contenedora que tenga un método para cada operación que desee realizar. Cada uno de estos métodos no debería tener una lógica real, sino simplemente pasar sus parámetros en la forma en que el servicio externo lo comprenderá, y devolver un objeto que contenga los datos que devuelva el servicio externo. Por ejemplo, si está interactuando con una base de datos, la clase contenedora podría formatear sus parámetros en una declaración SQL, enviarlos a un objeto de Connection existente y devolver una List para el resultado.

Porque los métodos de la clase contenedora no contienen lógica (es decir, no if / else, no loops y ningún manejo de excepciones); no hay necesidad de probar la unidad de la clase contenedora. Debería probar la integración de la clase contenedora, para asegurarse de que sus responsabilidades se realizan correctamente (es decir, que la declaración SQL tenga el efecto deseado en la base de datos, por ejemplo).

Ahora vuelve a escribir las clases que interactúan con los servicios externos para que interactúen con las clases contenedoras. Entonces es fácil probarlos en una unidad, solo tiene que burlarse de las clases de envoltura.