:::: MENU ::::

Mockito


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 ?