Esta es una gran pregunta! Creo que la causa principal es la siguiente, estamos usando JUnit no solo para pruebas unitarias. Entonces la pregunta debería ser dividida:
- ¿Debo usar Mockito.verify () en mi prueba de integración (o cualquier otra prueba superior a la unidad)?
- ¿Debo usar Mockito.verify () en mi unidad de prueba de caja negra ?
- ¿Debo usar Mockito.verify () en mi unidad de prueba de caja blanca ?
así que si ignoramos las pruebas superiores a la unidad, la pregunta puede reformularse: " Usar pruebas unitarias de caja blanca con Mockito.verify () crea una gran pareja entre la prueba unitaria y mi posible implementación, ¿puedo hacer algo de " caja gris? " pruebas unitarias y qué reglas generales debería usar para esto ".
Ahora, repasemos todo esto paso a paso.
* - ¿Debo usar Mockito.verify () en mi integración prueba de (o cualquier otra prueba superior a la unidad)? * Creo que la respuesta es claramente no, además no debes usar simulacros para esto. Su prueba debe estar lo más cerca posible de la aplicación real. Está probando un caso de uso completo, no una parte aislada de la aplicación.
* Recuadro negro vs caja blanca pruebas unitarias * Si está utilizando recuadro negro de enfoque de lo que es realmente haciendo, de alimentación (todas las clases de equivalencia) de entrada, un estado de salida, y las pruebas que va a recibir esperado. En este enfoque, el uso de simulacros en general está justificado (simplemente imitas que están haciendo lo correcto; no quieres probarlos), pero llamar a Mockito.verify () es superfluo.
Si está utilizando un enfoque de caja blanca, ¿qué está haciendo realmente? Está probando el comportamiento. de su unidad. En este enfoque, llamar a Mockito.verify () es esencial, debe verificar que su unidad se comporte como espera.
reglas generales para las pruebas de caja gris
El problema con las pruebas de caja blanca es que crea un alto acoplamiento. Una posible solución es hacer pruebas de caja gris, no pruebas de caja blanca. Esta es una especie de combinación de pruebas de caja en blanco y negro. Realmente está probando el comportamiento de su unidad como en las pruebas de caja blanca, pero en general lo hace independiente de la implementación cuando es posible . Cuando sea posible, solo hará una verificación como en el caso de caja negra, solo afirma que la salida es lo que se espera que sea. Entonces, la esencia de su pregunta es cuándo es posible.
Esto es realmente dificil. No tengo un buen ejemplo, pero puedo darte ejemplos. En el caso que se mencionó anteriormente con equals () vs equalsIgnoreCase (), no debe llamar a Mockito.verify (), simplemente afirme la salida. Si no pudo hacerlo, divida su código en la unidad más pequeña, hasta que pueda hacerlo. Por otro lado, suponga que tiene algún @Service y está escribiendo @ Web-Service que es esencialmente un envoltorio en su @Service: delega todas las llamadas al @Service (y realiza un tratamiento adicional de errores). En este caso, llamar a Mockito.verify () es esencial, no debe duplicar todas las comprobaciones que hizo para @Serive, verificando que es suficiente llamar a @Service con la lista de parámetros correcta.