Mockito

Diciembre 2016

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.

Mockito es OpenSource y es disponible en esta dirección: http://mockito.org/

Mockito se basa en el principio de un objeto mock que simula el comportamiento de otro objeto.

La implementación de tests Mockito se hace en varias etapas:
  • Creación del objeto mock.
  • Descripción del comportamiento esperado
  • Uso de los mocks
  • Verificación que la interacción con los mocks sea correcta.


Ejemplo:

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());
}

}
  • Analysis del código:

ClaseA ca = mock(ClaseA.class);
=> Creamos un objeto ca, un mock de la clase ClaseA.

cb.setCa(ca);
=> Asignamos el objeto ca al objeto cb.

cb.met1();
=>Llamamos al objeto cb con el método met1().

Mockito.verify(ca, Mockito.times(2)).fonc1();
=> Verificamos que el método fonc1 del mock ca sea llamado dos veces.

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 cualquiera.

Si la verificación fracasa se genera una excepción.

Ejemplo:

Mockito.verify(ca, Mockito.atLeast(1)).fonc2();
=> Esta línea genera la excepción siguiente:
Exception in thread "main" Wanted but not invoked:
claseA.fonc2();
-> at Test01.main(Test01.java:16)


==> Esta indica que el método fonc2() del mock ca no es llamado.




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));


Analisis del código:
Mockito.when(ca.fonc3( Mockito.anyInt(), Mockito.anyInt())). thenReturn(Integer.valueOf(5));


=> El valor de retorno de la función fonc3 del mock ca era 0.
La forzamos a 5.

Sobre todo, esta funcionalidad es útil cuando tenemos una función que contiene varios procesos (condiciones, bucles whiles,…) y deseamos comprobar el comportamiento de toda la función. Por lo tanto necesitamos configurar los mocks utilizados en esta función para que pase todos estos procesos y condiciones.


Consulta también :
El documento «Mockito» de CCM (es.ccm.net) se encuentra disponible bajo una licencia Creative Commons. Puedes copiarlo o modificarlo siempre y cuando respetes las condiciones de dicha licencia y des crédito a CCM.