Mockito es un marco de trabajo de test para Java. Nos permite simular objetos sin tener que instanciarlos completamente. De este modo podemos hacer tests de ciertas secciones del código sin tener que esperar que los componentes de los que dependemos estén terminados, ya que podemos simularlos.
Instalación
Mediante Maven.
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-all</artifactId> <version>2.0.2-beta</version> </dependency>
Configuración
La herramienta no se configura, pero sí que hay que crear un método setup() en los tests para iniciar los objetos simulados.
Ejemplo básico
Creamos un servicio (childService) y luego otro que dependa del primero (parentService).
ChildService.java
package com.luisgomezcaballero.mockitodemo; public class ChildService { public int check123(int number) { if (number == 123) { return 1; } else { return 0; } } }
ParentService.java
package com.luisgomezcaballero.mockitodemo; public class ParentService { private ChildService childService; public ChildService getChildService() { return childService; } public void setChildService(ChildService childService) { this.childService = childService; } public int checkCorrectNumber(int myNumber) { if (childService.check123(myNumber) == 1) { return 1; } else { return 0; } } }
Hacemos un test:
ParentServiceTest.java
package com.luisgomezcaballero.mockitodemo; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import com.luisgomezcaballero.mockitodemo.ChildService; import com.luisgomezcaballero.mockitodemo.ParentService; public class ParentServiceTest { @Mock ChildService childService; @Before public void setup() { MockitoAnnotations.initMocks(this); } @Test public void testCheckCorrectNumber() { ParentService parentService = new ParentService(); parentService.setChildService(childService); int testNumber = 123; when(childService.check123(testNumber)).thenReturn(1); int checkCorrectNumber = parentService.checkCorrectNumber(testNumber); assertEquals(checkCorrectNumber, 1); verify(childService).check123(testNumber); } }
El núcleo de Mockito es la simulación que hacemos con:
when(childService.check123(testNumber)).thenReturn(1);
De este modo simularemos el método del servicio hijo (childService) y de este modo podremos testear el método del servicio padre (parentService).
Como se ve, después, usamos cualquier tipo de assert para confirmar que el resultado obtenido es el esperado.
Ejemplo con excepciones
Es parecido, salvo que hay que usar
when().thenThrow(Exception.class)
Y anotar el método del test con:
@Test(expected = Exception.class)
Verificación
Importante: aunque tengamos un test satisfactorio es posible que el método que estamos simulando no se ejecute (con lo que la prueba no será completa). Para evitar estas situaciones y asegurarnos de que el método simulado se ejecuta correctamente, usamos después del assert:
verify(childService).check123(testNumber);
Repositorio
El código de este proyecto puede encontrarse en https://github.com/luisgomezcaballero/mockito-demo.git.
So, what do you think ?