¿Qué hacer cuando el conflicto Java mejores prácticas con Mockito
Pregunta
Mi equipo de desarrollo ha comenzado a utilizar Mockito y tienen clases que se han definido como 'final'. He leído en Java eficaz por Joshua Bloch y en el hilo para href="https://stackoverflow.com/questions/154314/when-to-use-final"> todas las clases deben utilizar el modificador final. Ha habido cierto desacuerdo en el hilo, pero estoy de acuerdo con la idea de forzar a la composición de clase a menos que la herencia tiene sentido.
¿Qué debo hacer cuando quiero probar clases utilizando un marco de pruebas como Mockito que requiere clases de no tener el modificador 'final'? Estoy esperando que alguien más ha encontrado con problemas similares durante su desarrollo. Lo resoluciones qué su equipo de desarrollo llegan a?
Hay dos respuestas obvias como el uso de JMock o eliminar el modificador 'final' en las clases que desea probar, pero que quieren seguir con un marco de prueba externa (además de JUnit) y puede ser difícil convencer a otros desarrolladores para eliminar el modificador 'final'.
Gracias.
Solución
¿Qué es lo que más necesita:
- La capacidad para asegurarse de que alguien no se hereda de la clase, o
- La capacidad de asegurarse de que su código es comprobable mediante su marco de burla de elección?
En general, creo que no es necesario para hacer cumplir (1). Para mí, la capacidad de prueba (2), es mucho más importante. Lo que se ajusta mejor a su situación?
Otros consejos
Si desea que sus clases sean definitiva puede hacer que se implementan las interfaces. Las interfaces son mockable.
Como ya se ha mencionado en la otra respuesta que puede hacer sus clases finales de ejecución Interfaz (s) y en sus pruebas de simulacro de la interfaz (s).
Esta es una de las ventajas de utilizar objetos de imitación; en escenarios como este te hacen pensar en cómo el código puede ser mejor organizada. Si su base de código tiene mucha referencia a las clases finales (tanto vinculantes para la aplicación concreta) que viola el principio OO de "programación a una interfaz" y la necesidad de una mejor capacidad de prueba le ayudará a pensar de refactorización de eliminar la dependencia implementaciones concretas.
Este documento sobre el uso de objetos Mock Endo-prueba: Pruebas unitarias con objetos Mock tiene una sección (4.4) titulado descubrimiento Interface que explica cómo mock objetos ayudan en el descubrimiento de los interfaces.