Tutorial de Mockito Java: qué es, ejemplos, static...

Tutorial de Mockito Java: qué es, ejemplos, static...

Mockito es un framework para pruebas de aplicaciones Java. Permite simular comportamientos complejos de objetos, además facilita el desarrollo de test unitarios y la detección de errores.

¿Cómo se implementan los test en Mockito? 

Mockito es open source y puedes obtenerlo a través de la página web oficial. Se basa en el principio de un objeto mock que simula el comportamiento de otro objeto. La implementación de test en Mockito se hace en varias etapas:

  1. Creación del objeto mock.
  2. Descripción del comportamiento esperado.
  3. Uso de los mocks.
  4. Verificación de que la interacción con los mocks sea correcta.

¿Algún ejemplo y análisis de código? 

public class ClaseA {
public ClaseA()
{
}
public void fonc1()
{
}
public void fonc2()
{
}
public int fonc3(int a, int b)
{
return a+b;
}
}
public class ClaseB {
ClaseA ca ;
public ClaseA getCa() 
{
return ca;
}
public void setCa(ClaseA ca) 
{
this.ca = ca;
}
public ClaseB()
{
ca =new ClaseA();
}
public void met1()
{
ca.fonc1();
ca.fonc1();
System.out.println(ca.fonc3(5, 6));
}
public void met2()
{
ca.fonc2();
}
}
  • Test unitario de la clase ClaseB :
import static org.mockito.Mockito.mock;
import org.mockito.Mockito;
public class Test 
{
public static void main(String[] args) 
{
ClaseA ca = mock(ClaseA.class);
ClaseB cb =new ClaseB();
cb.setCa(ca);
cb.met1();
Mockito.verify(ca, Mockito.times(2)).fonc1();
Mockito.verify(ca, Mockito.times(1)).fonc3( Mockito.anyInt(), Mockito.anyInt());
}
}
  • Análisis del código:
  1. ClaseA ca = mock(ClaseA.class); => Creamos un objeto 'ca', un mock de la clase ClaseA.
  2. cb.setCa(ca); => Asignamos el objeto 'ca' al objeto 'cb'.
  3. cb.met1(); => Llamamos al objeto 'cb' con el método 'met1()'.
  4. Mockito.verify(ca, Mockito.times(2)).fonc1(); => Verificamos que el método 'fonc1' del mock 'ca' se ha llamado dos veces.
  5. Mockito.verify(ca, Mockito.times(1)).fonc3( Mockito.anyInt(), Mockito.anyInt()); => Verificamos que el método 'fonc3' del mock 'ca' sea llamado una sola vez por dos parámetros enteros. Si la verificación fracasa se genera una excepción:
  • Mockito.verify(ca, Mockito.atLeast(1)).fonc2(); => Esta línea genera la siguiente excepción, que indica que el método 'fonc2()' del mock 'ca' no es llamado:
Exception in thread "main" Wanted but not invoked:
claseA.fonc2();
-> at Test01.main(Test01.java:16)
  • También podemos modificar el resultado de retorno de una función.
System.out.println(" El resultado de ca.fonc(3,3) es "+ca.fonc3(3, 3));
Mockito.when(ca.fonc3( Mockito.anyInt(), Mockito.anyInt())).thenReturn(Integer.valueOf(5));
System.out.println(" El resultado de ca.fonc(3,3) es "+ca.fonc3(3, 3));

La segunda línea indica que el valor de retorno de la función 'fonc3' del mock 'ca' era 0. La forzamos a 5. Esta funcionalidad es útil cuando tenemos una función que contiene varios procesos (condiciones, bucles…) y deseamos comprobar el comportamiento de toda la función. Para ello necesitamos configurar los mocks utilizados.