Mocking Void Methods con Mockito

1. Panoramica

In questo breve tutorial, ci concentriamo sulla derisione dei metodi void con Mockito.

Come con altri articoli incentrati sul framework Mockito (come Mockito Verify, Mockito When / Then e Mockito's Mock Methods), la classe MyList mostrata di seguito verrà utilizzata come collaboratore nei casi di test.

Aggiungeremo un nuovo metodo per questo tutorial:

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

2. Semplice derisione e verifica

Void metodi possono essere utilizzati con Mockito di DoNothing () , doThrow () , e doAnswer () metodi, rendendo beffardo e verifica 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, ""); }

Tuttavia, doNothing () è il comportamento predefinito di Mockito per i metodi void .

Questa versione di whenAddCalledVerified () realizza la stessa cosa di quella sopra:

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

DoThrow () genera un'eccezione:

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

Parleremo doAnswer () in basso.

3. Acquisizione di argomenti

Un motivo per sovrascrivere il comportamento predefinito con doNothing () è acquisire gli argomenti.

Nell'esempio sopra, abbiamo utilizzato il metodo verify () per controllare gli argomenti passati a add () .

Tuttavia, potremmo aver bisogno di catturare gli argomenti e fare qualcosa di più con loro.

In questi casi, usiamo doNothing () proprio come abbiamo fatto sopra, ma 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. Risposta a una chiamata a Void

Un metodo può eseguire un comportamento più complesso rispetto alla semplice aggiunta o impostazione di valore.

Per queste situazioni, possiamo usare la risposta di Mockito per aggiungere il comportamento di cui abbiamo bisogno:

@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"); } 

Come spiegato nelle funzionalità Java 8 di Mockito, utilizziamo un lambda con Answer per definire il comportamento personalizzato per add () .

5. Derisione parziale

Anche le derisioni parziali sono un'opzione. DoCallRealMethod () di Mockito può essere utilizzato per i metodi 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"); } 

In questo modo, possiamo chiamare il metodo effettivo e verificarlo allo stesso tempo.

6. Conclusione

In questo breve articolo, abbiamo coperto quattro diversi modi per affrontare i metodi void durante i test con Mockito.

Come sempre, gli esempi sono disponibili in questo progetto GitHub.