Java Mockito y los Mock Object
Java Mockito es uno de los frameworks de Mock más utilizados en la plataforma Java. Esto
es debido a la gran facilidad de uso que tiene. Vamos a intentar explicar el concepto de
Mock y como funciona Java Mockito , para ello construiremos unos test sencillos partiendo
de dos clases de Servicio que se encuentran relacionadas. Recordemos que muchas
metodologías apoyan generar los test primero ,pero aquí nos vamos a centrar en los
conceptos.
En este caso una clase se encarga de sumar dos números y la otra se encarga de
multiplicarlos.
public interface ServicioA {
public abstract int sumar(int a, int b);
package [Link];
[Link]
Java Mockito y los Mock Object
public class ServicioAImpl implements ServicioA {
public int sumar(int a ,int b) {
return a+b;
}
}
package [Link];
public interface ServicioB {
public ServicioA getServicioA();
public void setServicioA(ServicioA servicioA);
public int multiplicarSumar(int a, int b, int multiplicador);
public int multiplicar(int a, int b);
package [Link];
public class ServicioBImpl implements ServicioB {
private ServicioA servicioA;
public ServicioA getServicioA() {
[Link]
Java Mockito y los Mock Object
return servicioA;
}
public void setServicioA(ServicioA servicioA) {
[Link] = servicioA;
}
public int multiplicarSumar(int a ,int b,int multiplicador) {
return [Link](a, b)*multiplicador;
public int multiplicar(int a ,int b) {
return a*b;
}
}
Como podemos observar ambas clases disponen de un método que se puede testear de
forma aislada ServicioA (sumar) y ServicioB (multiplicar). Vamos a instalar JUnit y Mockito
como dependencias de Maven para poder trabajar.
<project xmlns="[Link]
xmlns:xsi="[Link]
xsi:schemaLocation="[Link]
[Link]
<modelVersion>4.0.0</modelVersion>
<groupId>[Link]</groupId>
[Link]
Java Mockito y los Mock Object
<artifactId>mocks</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mocks</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>[Link]</groupId>
<artifactId>mockito-core</artifactId>
<version>1.10.19</version>
</dependency>
</dependencies>
</project>
Construimos los test :
package [Link];
import [Link];
import [Link];
import [Link];
import [Link];
public class TestServicioA {
@Test
[Link]
Java Mockito y los Mock Object
public void testSuma() {
int a=2;
int b=2;
ServicioA servicio= new ServicioAImpl();
[Link]([Link](a, b),4);
}
}
package [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
public class TestServicioB {
@Test
public void testMultiplicacion() {
ServicioB servicioB= new ServicioBImpl();
[Link]([Link](2, 3),6);
[Link]
Java Mockito y los Mock Object
Ejecutamos ambos Test con JUnit :
Ahora bien ¿qué pasará si tenemos que testear el método sumarMultiplicar que tiene el
ServicioB?. Este método primero suma dos números delegando en el ServicioA y luego los
multiplica.
@Test
public void testmultiplicarSumar() {
ServicioA servicioA=new ServicioAImpl();
ServicioB servicioB= new ServicioBImpl();
[Link]
Java Mockito y los Mock Object
[Link](servicioA);
[Link]([Link](2, 3, 2),10);
Todo funciona correctamente. Los problemas aparecen cuando yo modifico el método
sumar del ServicioA y le asigno el siguiente código:
package [Link];
public class ServicioAImpl implements ServicioA {
public int sumar(int a ,int b) {
return a+b+1;
}
}
[Link]
Java Mockito y los Mock Object
Los test fallarán:
Fallan dos test y no uno solo, esto es un problema importante ya que los desarrolladores no
sabrán que esta pasando exactamente. Para evitar este tipo de problemas debemos aislar
las pruebas unitarias y una de las opciones es usar Java Mockito y crear un Mock Object.
Los objetos Mock nos permiten simular ser un objeto real y eliminan dependencias ,
permitiendo que los test se ejecuten de forma aislada.
Vamos a ver el código:
[Link]
Java Mockito y los Mock Object
@Test
public void testmultiplicarSumar() {
ServicioA servicioA=mock([Link]);
when([Link](2,3)).thenReturn(5);
ServicioB servicioB= new ServicioBImpl();
[Link](servicioA);
[Link]([Link](2, 3, 2),10);
Hemos creado un mock que simula ser el ServicioA para la operación de suma(2,3) y
devuelve como resultado 5. Si volvemos a ejecutar los test:
Ahora solo falla un test , hemos conseguido aislar cada uno de ellos y los desarrolladores
podrán encontrar los errores de forma fácil. Para ello hemos construido un objeto Mock
utilizando Java Mockito.
Otros artículos relacionados: Java Proxy , Java Annotations
[Link]
Java Mockito y los Mock Object
[Link]