Test con Mockito


Como todos sabemos una tendencia dentro de la programación es usar TDD (Test Driven Development) y para ello se utiliza mucho la librería de Mockito así que aquí les dejo un ejemplo. Espero les sirva:

//De entrada tenemos una clase VO
public class PruebaVo {
 private String nombre;
 private String apellidoPaterno;
 private String apellidoMaterno;
 private Integer edad;

 public String getNombre() {
  return nombre;
 }
 public void setNombre(final String nombre) {
  this.nombre = nombre;
 }
 public String getApellidoPaterno() {
  return apellidoPaterno;
 }
 public void setApellidoPaterno(final String apellidoPaterno) {
  this.apellidoPaterno = apellidoPaterno;
 }
 public String getApellidoMaterno() {
  return apellidoMaterno;
 }
 public void setApellidoMaterno(final String apellidoMaterno) {
  this.apellidoMaterno = apellidoMaterno;
 }
 public Integer getEdad() {
  return edad;
 }
 public void setEdad(final Integer edad) {
  this.edad = edad;
 }
}

Despues nuestra clase a la que le haremos una prueba (es muy sencilla)
public class ClaseParaPruebaDeMockito {

 private static final String CADENA_ESPACIO = " ";

 public String validaEdad(final PruebaVo pruebaVo) {
  String returnValue = "";

  if (pruebaVo.getNombre() != null && pruebaVo.getApellidoPaterno() != null) {
   final boolean flag = validaEdad(pruebaVo.getEdad());
   if (flag) {
    returnValue = imprimirDatos(pruebaVo);
   }
  }

  return returnValue;

 }

 private String imprimirDatos(final PruebaVo pruebaVo) {
  final StringBuilder builder = new StringBuilder();
  builder.append(pruebaVo.getNombre());
  builder.append(CADENA_ESPACIO);
  builder.append(pruebaVo.getApellidoPaterno());

  if (pruebaVo.getApellidoMaterno() != null) {
   builder.append(CADENA_ESPACIO);
   builder.append(pruebaVo.getApellidoMaterno());

  }
  builder.append(CADENA_ESPACIO);
  builder.append(pruebaVo.getEdad());

  return builder.toString();
 }

 private boolean validaEdad(final Integer edad) {

  if (edad >= 18) {
   return true;
  } else {
   return false;
  }

 }
}

Y finalmente nustro test, cabe mencionar que los metodos privados no pueden ser probados de forma directa por mockito por lo que debemos hacerlo pasar atravez del metodo publico que lo llama:
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.runners.MockitoJUnitRunner;
//Tambien se peude utilizar esta anotacion para inicializar los mocks en caso de usar esta opcion quitar el before
//@RunWith(MockitoJUnitRunner.class)
public class ClasePruebaTest {
 // Creamos nuestra clase que sera probada inyectando todos los objetos mock
 @InjectMocks
 private final ClaseParaPruebaDeMockito claseParaPruebaDeMockito = new ClaseParaPruebaDeMockito();
//Agregamos el mock a la clase
 @Mock
 private PruebaVo pruebaVo;

 @Before
 public void init() {
  // Con esto inicializamos los mocks
  MockitoAnnotations.initMocks(this);
 }

 @Test
 public void deberiaValidarEdadEImprimirDatos() {

  // pruebaVo.setApellidoPaterno("a"); utilizamos when para hacer que al
  // ejecutarse nos devuelva un valor en concreto en este caso rosa
  when(pruebaVo.getNombre()).thenReturn("Rosa");
  when(pruebaVo.getApellidoPaterno()).thenReturn("Juarez");
  when(pruebaVo.getEdad()).thenReturn(19);

  final String saludo = claseParaPruebaDeMockito.validaEdad(pruebaVo);

  // verificamos que estamos ejecutando los get.
  // Nota: los verify solo se pueden ejecutar sobre objetos mock y no se
  // tiene acceso a metodos privados
  // times() sirve para saber cuantas veces es llamada una peticion u
  // objeto en este caso apellido materno es solo una vez por eso no
  // requiere en time
  verify(pruebaVo, times(2)).getNombre();
  verify(pruebaVo, times(2)).getApellidoPaterno();
  verify(pruebaVo).getApellidoMaterno();
  verify(pruebaVo, times(2)).getEdad();
  // Nos aseguramos que el metodo nos regrese los datos correctos
  assertEquals(saludo, "Rosa Juarez 19");

 }

 // creamos nuestro metodo para probar
 @Test
 public void deberiaValidarEdadEImprimirDatosConApellidoMaterno() {

  // pruebaVo.setApellidoPaterno("a"); utilizamos when para hacer que al
  // ejecutarse nos devuelva un valor en concreto en este caso rosa
  when(pruebaVo.getNombre()).thenReturn("Rosa");
  when(pruebaVo.getApellidoPaterno()).thenReturn("Juarez");
  when(pruebaVo.getApellidoMaterno()).thenReturn("Perez");
  when(pruebaVo.getEdad()).thenReturn(19);

  final String saludo = claseParaPruebaDeMockito.validaEdad(pruebaVo);

  // verificamos que estamos ejecutando los get.
  // Nota: los verify solo se pueden ejecutar sobre objetos mock y no se
  // tiene acceso a metodos privados
  // times() sirve para saber cuantas veces es llamada una peticion u
  // objeto a diferiencia del caso anterior getApellidoMaterno necesita el
  // times por que al entrar al if hace dos veces la peticion
  verify(pruebaVo, times(2)).getNombre();
  verify(pruebaVo, times(2)).getApellidoPaterno();
  verify(pruebaVo, times(2)).getApellidoMaterno();
  verify(pruebaVo, times(2)).getEdad();
  // Nos aseguramos que el metodo nos regrese los datos correctos
  assertEquals(saludo, "Rosa Juarez Perez 19");

 }

 // creamos nuestro metodo para probar
 @Test
 public void deberiaValidarEdadEImprimirDatosConEdadMenor() {

  // pruebaVo.setApellidoPaterno("a");
  // utilizamos when para hacer que al ejecutarse nos devuelva un valor
  // en concreto en este caso rosa
  when(pruebaVo.getNombre()).thenReturn("Rosa");
  when(pruebaVo.getApellidoPaterno()).thenReturn("Juarez");
  when(pruebaVo.getApellidoMaterno()).thenReturn("Perez");
  when(pruebaVo.getEdad()).thenReturn(17);

  final String saludo = claseParaPruebaDeMockito.validaEdad(pruebaVo);

  // verificamos que estamos ejecutando los get.

  verify(pruebaVo).getNombre();
  verify(pruebaVo).getApellidoPaterno();
  verify(pruebaVo).getEdad();
  // Nos aseguramos que el metodo nos regrese los datos correctos
  assertEquals(saludo, "");

 }

}

Post a Comment

Artículo Anterior Artículo Siguiente