Mockito

De Dos Ideas.

(Diferencias entre revisiones)
(GKDorcaBtDCpsMFwVFD)
Línea 1: Línea 1:
-
I'm relaly into it, thanks for this great stuff!
+
Mockito es una librería [[Java]] para la creación de [[Mock Object]] muy usados para el testeo unitario en [[Test Driven Development]], basado en [[EasyMock]].
 +
 
 +
Mockito fue creado con el objetivo de simplificar y solucionar algunos de los temas antes mencionados. EasyMock y Mockito puede hacer exactamente las mismas cosas, pero Mockito tiene un API más natural y práctico de usar.
 +
 
 +
==Características principales==
 +
# Se pueden crear mocks de interfaces y clases concretas.
 +
# Verificación de invocaciones (cantidad exacta, al menos una vez, órden de invocación, etc.)
 +
# El stack trace se mantiene limpio, ya que los errores ocurren en los assert que se hagan (y no dentro del método bajo prueba, como en EasyMock).
 +
# Un API más clara para crear stubs y verificaciones
 +
 
 +
==Ejemplo de uso==
 +
<code java>
 +
import static org.mockito.Mockito.*;
 +
.....
 +
//creamos el mock y el stub
 +
ArrayList instance = mock(ArrayList.class);
 +
doReturn("hola mundo").when(instance).get(0);
 +
 +
//ejecutamos la lógica a probar
 +
instance.get(0);   
 +
 +
//verificamos que se hayan invocado los métodos
 +
verify(instance).get(0);
 +
</code>
 +
 
 +
==Más de una invocación a un mismo método==
 +
 
 +
Algunas veces necesitamos que un método retorne un valor y que en la segunda invocación retorne nulo o una excepción. Para eso, anidamos los retornos:
 +
 
 +
<code html4strict>
 +
 
 +
//Retornos para las 2 invocaciones
 +
doReturn("algo").doReturn(null).when(instance).scrollNext();
 +
 
 +
//ejecutamos la lógica a probar
 +
instance.unMetodoQueUsaScroll();   
 +
 
 +
//verificamos que se haya invocado el mismo método dos veces
 +
verify(instance, times(2)).scrollNext();
 +
 
 +
</code>
 +
 
 +
* [http://mockito.googlecode.com/svn/branches/1.5/javadoc/org/mockito/Mockito.html Leer más en Mockito API]
 +
 
 +
==Ejemplos de Mockito junto a PowerMock==
 +
 
 +
I found just what I was ndeeed, and it was entertaining!
 +
 
 +
Last one to ultiize this is a rotten egg!
 +
 
 +
===Inicialización de atributos estaticos===
 +
 
 +
<code java>
 +
public class PruebaInicializacionEstaticos {
 +
 
 +
    private static final String atributo = new String("CHAU");
 +
 +
    public String crearObjetoLista() {
 +
        return atributo;
 +
    }
 +
}
 +
</code>
 +
 
 +
<code java>
 +
@RunWith(PowerMockRunner.class)
 +
@SuppressStaticInitializationFor("PruebaInicializacionEstaticos")
 +
@PrepareForTest(PruebaInicializacionEstaticos.class)
 +
public class PruebaMetodoPrivadoTest {
 +
 +
 
 +
  PruebaInicializacionEstaticos pruebaInicializacionEstaticos =
 +
                                    new PruebaInicializacionEstaticos();
 +
 +
    @Test
 +
    public void controlCreacionLista() throws Exception {
 +
Assert.assertNull(pruebaInicializacionEstaticos.retornarAtrinbuto());
 +
        String s = "Hola";
 +
        Whitebox.setInternalState(pruebaInicializacionEstaticos.class,"atributo", s);
 +
        Assert.assertEquals(s, pruebaInicializacionEstaticos.retornarAtrinbuto());
 +
    }
 +
}
 +
</code>
 +
 
 +
===Captura creación de objetos===
 +
 
 +
<code java>
 +
public class PruebaCreacionObjeto {
 +
 +
    public List crearObjetoLista() {
 +
        return new ArrayList();
 +
    }
 +
}
 +
</code>
 +
 
 +
<code java>
 +
@RunWith(PowerMockRunner.class)
 +
@PrepareForTest(PruebaCreacionObjeto.class)
 +
public class PruebaMetodoPrivadoTest {
 +
 +
  @Spy
 +
  PruebaCreacionObjeto pruebaCreacionObjeto = new PruebaCreacionObjeto();
 +
 +
    @Test
 +
    public void controlCreacionLista() throws Exception {
 +
        List list = new ArrayList();
 +
        list.add("Hola");
 +
        whenNew(ArrayList.class).withNoArguments().thenReturn((ArrayList) list);
 +
        List resultado = pruebaCreacionObjeto.crearObjetoLista();
 +
        Assert.assertEquals(list, resultado);
 +
        verifyNew(ArrayList.class);
 +
    }
 +
}
 +
</code>
 +
 
 +
Para mas ejemplos de Mockito junto a PowerMock ver los [http://code.google.com/p/powermock/wiki/MockitoUsage13 ejemplos] provisto por la documentación de PowerMock.
 +
 
 +
[http://www.dosideas.com/descargas/category/3-testing.html?download=40 Descargar proyecto NetBeans demo de los ejemplos]
 +
 
 +
===PowerMockito & Cobertura===
 +
Existe un problema al utilizar PowerMockito con Cobertura (versión 1.8.4), este último no registra la corrida de los test con anotación @PrepareForTest, dando como resultados falta de cobertura.
 +
Para solucionar este inconveniente solo hay que actualizar la versión de Cobertura.
 +
 
 +
I didn't know where to find this info then koaobm it was here.
 +
 
 +
== BDDMockito ==
 +
BDDMokcito es una clase alternativa que ofrece [[Mockito]] para crear pruebas al estilo [[Behavior Driven Development]] (BDD) (es decir, con bloques dado / cuando / entonces).
 +
 
 +
El problema es que el API de Mockito usa la palabra "when" y no se integra bien con los comentarios //given //when //then (según BDD, el stubbing forma parte del área //given, y no del //when).
 +
 
 +
BDDMockito agrega una clase que tiene alias para los métodos de stub, usando given(Object).
 +
 
 +
<code java5>
 +
import static org.mockito.BDDMockito.*;
 +
 +
Vendedor vendedor = mock(Vendedor.class);
 +
Negocio negocio = new Negocio(vendedor);
 +
 +
@Test
 +
public void comprarPan() throws Exception {
 +
  //given 
 +
  given(vendedor.buscarPan()).willReturn(new Pan());
 +
 
 +
  //when
 +
  Compra compra = negocio.comprarPan();
 +
 
 +
  //then
 +
  assertThat(compra, contienePan());
 +
}
 +
</code>
 +
 
 +
Stubbing con void y excepciones:
 +
<code java5>
 +
  //given
 +
  willThrow(new RuntimeException("boo")).given(mock).foo();
 +
 
 +
  //when
 +
  Result result = sistemaBajoPrueba.ejecutar();
 +
 
 +
  //then
 +
  assertEquals(failure, result);
 +
</code>
 +
 
 +
AKAIK you've got the aswner in one!

Revisión de 12:18 6 oct 2011

Mockito es una librería Java para la creación de Mock Object muy usados para el testeo unitario en Test Driven Development, basado en EasyMock.

Mockito fue creado con el objetivo de simplificar y solucionar algunos de los temas antes mencionados. EasyMock y Mockito puede hacer exactamente las mismas cosas, pero Mockito tiene un API más natural y práctico de usar.

Contenido

Características principales

  1. Se pueden crear mocks de interfaces y clases concretas.
  2. Verificación de invocaciones (cantidad exacta, al menos una vez, órden de invocación, etc.)
  3. El stack trace se mantiene limpio, ya que los errores ocurren en los assert que se hagan (y no dentro del método bajo prueba, como en EasyMock).
  4. Un API más clara para crear stubs y verificaciones

Ejemplo de uso

import static org.mockito.Mockito.*;
.....
//creamos el mock y el stub
ArrayList instance = mock(ArrayList.class);
doReturn("hola mundo").when(instance).get(0);
 
//ejecutamos la lógica a probar
instance.get(0);
 
//verificamos que se hayan invocado los métodos
verify(instance).get(0);

Más de una invocación a un mismo método

Algunas veces necesitamos que un método retorne un valor y que en la segunda invocación retorne nulo o una excepción. Para eso, anidamos los retornos:

//Retornos para las 2 invocaciones
doReturn("algo").doReturn(null).when(instance).scrollNext();
 
//ejecutamos la lógica a probar
instance.unMetodoQueUsaScroll();
 
//verificamos que se haya invocado el mismo método dos veces
verify(instance, times(2)).scrollNext();

Ejemplos de Mockito junto a PowerMock

I found just what I was ndeeed, and it was entertaining!

Last one to ultiize this is a rotten egg!

Inicialización de atributos estaticos

public class PruebaInicializacionEstaticos {
 
private static final String atributo = new String("CHAU");
 
public String crearObjetoLista() {
return atributo;
}
}
@RunWith(PowerMockRunner.class)
@SuppressStaticInitializationFor("PruebaInicializacionEstaticos")
@PrepareForTest(PruebaInicializacionEstaticos.class)
public class PruebaMetodoPrivadoTest {
 
 
PruebaInicializacionEstaticos pruebaInicializacionEstaticos =
new PruebaInicializacionEstaticos();
 
@Test
public void controlCreacionLista() throws Exception {
Assert.assertNull(pruebaInicializacionEstaticos.retornarAtrinbuto());
String s = "Hola";
Whitebox.setInternalState(pruebaInicializacionEstaticos.class,"atributo", s);
Assert.assertEquals(s, pruebaInicializacionEstaticos.retornarAtrinbuto());
}
}

Captura creación de objetos

public class PruebaCreacionObjeto {
 
public List crearObjetoLista() {
return new ArrayList();
}
}
@RunWith(PowerMockRunner.class)
@PrepareForTest(PruebaCreacionObjeto.class)
public class PruebaMetodoPrivadoTest {
 
@Spy
PruebaCreacionObjeto pruebaCreacionObjeto = new PruebaCreacionObjeto();
 
@Test
public void controlCreacionLista() throws Exception {
List list = new ArrayList();
list.add("Hola");
whenNew(ArrayList.class).withNoArguments().thenReturn((ArrayList) list);
List resultado = pruebaCreacionObjeto.crearObjetoLista();
Assert.assertEquals(list, resultado);
verifyNew(ArrayList.class);
}
}

Para mas ejemplos de Mockito junto a PowerMock ver los ejemplos provisto por la documentación de PowerMock.

Descargar proyecto NetBeans demo de los ejemplos

PowerMockito & Cobertura

Existe un problema al utilizar PowerMockito con Cobertura (versión 1.8.4), este último no registra la corrida de los test con anotación @PrepareForTest, dando como resultados falta de cobertura. Para solucionar este inconveniente solo hay que actualizar la versión de Cobertura.

I didn't know where to find this info then koaobm it was here.

BDDMockito

BDDMokcito es una clase alternativa que ofrece Mockito para crear pruebas al estilo Behavior Driven Development (BDD) (es decir, con bloques dado / cuando / entonces).

El problema es que el API de Mockito usa la palabra "when" y no se integra bien con los comentarios //given //when //then (según BDD, el stubbing forma parte del área //given, y no del //when).

BDDMockito agrega una clase que tiene alias para los métodos de stub, usando given(Object).

import static org.mockito.BDDMockito.*;
 
Vendedor vendedor = mock(Vendedor.class);
Negocio negocio = new Negocio(vendedor);
 
@Test
public void comprarPan() throws Exception {
//given
given(vendedor.buscarPan()).willReturn(new Pan());
 
//when
Compra compra = negocio.comprarPan();
 
//then
assertThat(compra, contienePan());
}

Stubbing con void y excepciones:

//given
willThrow(new RuntimeException("boo")).given(mock).foo();
 
//when
Result result = sistemaBajoPrueba.ejecutar();
 
//then
assertEquals(failure, result);

AKAIK you've got the aswner in one!