Diferencia entre revisiones de «Mockito»

De Dos Ideas.
Saltar a: navegación, buscar
(Ejemplo con PowerMock)
(Ejemplo de mockito junto a PowerMock)
Línea 48: Línea 48:
  
 
===Ejemplo de mockito junto a PowerMock===
 
===Ejemplo de mockito junto a PowerMock===
<code:java>
+
<code java>
 
@RunWith(PowerMockRunner.class)
 
@RunWith(PowerMockRunner.class)
 
@PrepareForTest(ClaseConMetodosEstaticos.class)
 
@PrepareForTest(ClaseConMetodosEstaticos.class)
Línea 55: Línea 55:
 
     public void testMetodo_conInvocacionAMetodosEstaticos() {
 
     public void testMetodo_conInvocacionAMetodosEstaticos() {
 
 
         //PowerMockito mockea los metodos estaticos que se encuentren en la clase ClaseConMetodosEstaticos
+
         //PowerMockito mockea los metodos estaticos que se encuentren en la  
 +
        //clase ClaseConMetodosEstaticos
 
         PowerMockito.mockStatic(ClaseConMetodosEstaticos.class);
 
         PowerMockito.mockStatic(ClaseConMetodosEstaticos.class);
  
Línea 64: Línea 65:
 
         instance.invocarMetodoEstatico();
 
         instance.invocarMetodoEstatico();
  
         //Por cada metodo estatico que se quiere verificar se debe invocar a PowerMockito.verifyStatic().
+
         //Por cada metodo estatico que se quiere verificar se debe invocar  
 +
        //a PowerMockito.verifyStatic().
 
         PowerMockito.verifyStatic();  
 
         PowerMockito.verifyStatic();  
 
         ClaseConMetodosEstaticos.secondStaticMethod();
 
         ClaseConMetodosEstaticos.secondStaticMethod();
Línea 70: Línea 72:
 
}
 
}
 
</code>
 
</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.
  
 
== BDDMockito ==
 
== BDDMockito ==

Revisión del 20:14 23 jul 2010

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

  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();

Invocación a un método estático

Para mockear métodos estáticos, según el FAQ de mockito, esto no es posible. Pero nombra 2 framewors que pueden resultarnos útil JMockit y PowerMock

Ejemplo de mockito junto a PowerMock

@RunWith(PowerMockRunner.class) @PrepareForTest(ClaseConMetodosEstaticos.class) public class DosIdeasTestCase {

   @Test
   public void testMetodo_conInvocacionAMetodosEstaticos() {
       //PowerMockito mockea los metodos estaticos que se encuentren en la 
       //clase ClaseConMetodosEstaticos
       PowerMockito.mockStatic(ClaseConMetodosEstaticos.class);
       //Con mockito determinamos el retorno del metodo estatico
       when(ClaseConMetodosEstaticos.firstStaticMethod(param)).thenReturn(value);
       // ejecucion 
       instance.invocarMetodoEstatico();
       //Por cada metodo estatico que se quiere verificar se debe invocar 
       //a PowerMockito.verifyStatic().
       PowerMockito.verifyStatic(); 
       ClaseConMetodosEstaticos.secondStaticMethod();
   }

}

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

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); 

Ver también