Cómo probar componentes de Spring con Mockito

Este post explica de una forma muy sencilla y didáctica como usar Mockito para probar nuestros beans de Spring para testar nuestros Servicios sin depender de los colaboradores (que por ejemplo pueden necesitar conexiones con base de datos:

Vamos allá con el resumen del post:

Supongamos un Servicio (SalaryService) que calcula el salario neto de un empleado en base a un id y para eso usa 2 colaboradores (EmployeeDAO para recuperar el salario bruto y TaxCalculator para calcular las retenciones).

En Spring esto se modelaría así:

En el ejemplo lo que queremos es testar la funcionalidad del SalaryService.getNetSalary (que si veis para salarios menos de 20000 no tiene retenciones) y sin preocuparnos del funcionamiento de los colaboradores (

Para probar este funcionamiento basta crear una clase de Test en la que a los colaboradores les marquemos con la anotación @Mock y al Servicio a testar con @InjectMocks:

Y luego implementar los métodos de tests, en este caso la lógica de getNetSalary requiere testar cómo se comporta la clase cuando el salario es menor al límite de aplicación de retenciones y cuando es mayor:

Cuando el salario es menor que el mínimo para el que aplican retenciones:

indicaré con el método when como deben compararse los colaboradores:

· employeeDAO.getAnnualSalary devolverá 10000

· taxCalculator.calculateTaxes devuelve el 10% de 10000: 1000

y luego compruebo que no se han aplicado retenciones con un assertThat verificando que el sueldo neto es el mismo que el bruto.

Cuando el salario es mayor que el mínimo para el que aplican retenciones

Hago los métodos when y verifico que se han aplicaciones retenciones.

Nota: en lugar de @Mock se puede usar la anotación @Spy que nos permite en lugar de definir el comportamiento de los componentes Mock con when reemplazarlos con una clase Mock: http://docs.mockito.googlecode.com/hg/latest/org/mockito/Spy.html

Resulta tan sencillo probarlo que es difícil argumentar que no se pueden hacer test unitarios de un Servicio compuesto, verdad? 😀

Deja un comentario