Pruebas unitarias parte 3: Introducción a Spying con Mockito


En el post anterior hablamos sobre Pruebas unitarias parte 2: JUnit y Mockito primeros pasos, el siguiente paso será hablar sobre Spying.

¿Qué es un Spy y cómo es diferente a un Mock?

Un Mock reemplaza por completo la clase base y solo devuelve valores por defecto o valores definidos por nosotros, mientras que un Spy mantendrá los objetos originales y solo reemplazará algunos métodos, a esto se le conoce como partial mocking.

Veamos el siguiente ejemplo:

@Mock
private ArrayList mockArrayList;

@Test
public void mockTest() {
	mockArrayList.add("Object 1");
	mockArrayList.add("Object 2");
	mockArrayList.add("Object 3");
	assertEquals(0, mockArrayList.size());
}

En el ejemplo anterior se crea un mock de la clase ArrayList,  como se puede observar se ejecuta el método add 3 veces pero al realizar la validación assertEquals(0, mockArrayList.size()); esta devuelve verdadero y el test es exitoso.

La pregunta natural es ¿Por qué si se agregaron 3 objetos a la lista, al ejecutar el método mockArrayList.size() devuelve 0? La respuesta es simple, el objeto mock que creamos no contiene una implementación real de los métodos add() o size(), si no que solo su definición que será utilizada para pruebas.

En el siguiente ejemplo se mostrarán las ventajas de utilizar Spying:

@Spy
private ArrayList spyArrayList;

@Test
public void spyTest() {
	spyArrayList.add("Object 1");
	spyArrayList.add("Object 2");
	spyArrayList.add("Object 3");

	assertEquals(3, spyArrayList.size());

	when(spyArrayList.size()).thenReturn(20);
	assertEquals(20, spyArrayList.size());
}

Como se puede ver el código es muy similar al anterior, la diferencia es que estamos utilizando un Spy en lugar de un Mock, con esto crearemos un partial mock,este nos permitirá mantener el comportamiento original del objeto y solo sobre escribir algunos comportamientos, analicemos el código anterior:

  1. Se agrega el objeto Object 1 a la lista
  2. Se agrega el objeto Object 2 a la lista
  3. Se agrega el objeto Object 3 a la lista
  4. Se valida si el tamaño de la lista es 3, al estar utilizando un Spy en lugar de un Mock el resultado será verdadero así que el test sera exitoso
  5. Se sobre escribe el comportamiento del método size definiendo que la próxima vez que se ejecute el valor que devolverá será 20.
  6. Se valida si el tamaño de la lista es 20, como sobre escribimos el comportamiento del método size para que la próxima ejecución devuelva 20 el test será exitoso.

 

Como conclusión, se puede observar que es posible crear partial mocks utilizando Spying con mockito, el como usarlos en sus aplicaciones depende de ustedes.

Síguenos en nuestras redes sociales https://twitter.com/geeks_mx y https://www.facebook.com/geeksJavaMexico/ para recibir los siguientes posts que hablarán de temas más avanzados sobre Testing, JUnit y Mockito.

Autor: Alejandro Agapito Bautista

Twitter: @raidentrance

Contacto:raidentrance@gmail.com

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s