Burlarse de los métodos del vacío con Mockito

1. Información general

En este breve tutorial, nos enfocamos en burlarse de métodos vacíos con Mockito.

Al igual que con otros artículos centrados en el marco de Mockito (como Mockito Verify, Mockito When / Then y Mockito's Mock Methods), la clase MyList que se muestra a continuación se utilizará como colaborador en casos de prueba.

Agregaremos un nuevo método para este tutorial:

public class MyList extends AbstractList { @Override public void add(int index, String element) { // no-op } }

2. Simulación y verificación simples

Void métodos se pueden utilizar con de Mockito DoNothing () , doThrow () , y doAnswer () métodos, haciendo burla y verificar intuitivo:

@Test public void whenAddCalledVerified() { MyList myList = mock(MyList.class); doNothing().when(myList).add(isA(Integer.class), isA(String.class)); myList.add(0, ""); verify(myList, times(1)).add(0, ""); }

Sin embargo, doNothing () es el comportamiento predeterminado de Mockito para los métodos void .

Esta versión de whenAddCalledVerified () logra lo mismo que la anterior:

@Test public void whenAddCalledVerified() { MyList myList = mock(MyList.class); myList(0, ""); verify(myList, times(1)).add(0, ""); } 

DoThrow () genera una excepción:

@Test(expected = Exception.class) public void givenNull_AddThrows() { MyList myList = mock(MyList.class); doThrow().when(myList).add(isA(Integer.class), isNull()); myList.add(0, null); } 

Vamos a cubrir doAnswer () a continuación.

3. Captura de argumentos

Una razón para anular el comportamiento predeterminado con doNothing () es capturar argumentos.

En el ejemplo anterior, usamos el método verify () para verificar los argumentos pasados ​​a add () .

Sin embargo, es posible que necesitemos capturar los argumentos y hacer algo más con ellos.

En estos casos, usamos doNothing () tal como lo hicimos anteriormente, pero con un ArgumentCaptor :

@Test public void whenAddCalledValueCaptured() { MyList myList = mock(MyList.class); ArgumentCaptor valueCapture = ArgumentCaptor.forClass(String.class); doNothing().when(myList).add(any(Integer.class), valueCapture.capture()); myList.add(0, "captured"); assertEquals("captured", valueCapture.getValue()); } 

4. Responder una llamada de anulación

Un método puede realizar un comportamiento más complejo que simplemente agregar o establecer un valor.

Para estas situaciones, podemos usar la Respuesta de Mockito para agregar el comportamiento que necesitamos:

@Test public void whenAddCalledAnswered() { MyList myList = mock(MyList.class); doAnswer(invocation -> { Object arg0 = invocation.getArgument(0); Object arg1 = invocation.getArgument(1); assertEquals(3, arg0); assertEquals("answer me", arg1); return null; }).when(myList).add(any(Integer.class), any(String.class)); myList.add(3, "answer me"); } 

Como se explica en las Características de Java 8 de Mockito, usamos una lambda con Respuesta para definir el comportamiento personalizado para add () .

5. Burla parcial

Las simulaciones parciales también son una opción. El doCallRealMethod () de Mockito se puede usar para métodos void :

@Test public void whenAddCalledRealMethodCalled() { MyList myList = mock(MyList.class); doCallRealMethod().when(myList).add(any(Integer.class), any(String.class)); myList.add(1, "real"); verify(myList, times(1)).add(1, "real"); } 

De esta forma, podemos llamar al método real y verificarlo al mismo tiempo.

6. Conclusión

En este breve artículo, cubrimos cuatro formas diferentes de abordar los métodos nulos al realizar pruebas con Mockito.

Como siempre, los ejemplos están disponibles en este proyecto de GitHub.