Verspottungsmethoden mit Mockito

1. Übersicht

In diesem kurzen Tutorial konzentrieren wir uns darauf, leere Methoden mit Mockito zu verspotten .

Wie bei anderen Artikeln, die sich auf das Mockito-Framework konzentrieren (wie Mockito Verify, Mockito When / Then und Mockitos Mock-Methoden), wird die unten gezeigte MyList- Klasse in Testfällen als Kollaborateur verwendet.

Wir werden eine neue Methode für dieses Tutorial hinzufügen:

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

2. Einfaches Verspotten und Überprüfen

Void Methoden können mit Mockito die verwendet werden DoNothing () , doThrow () , und doAnswer () Methoden, so dass spöttisch und Verifizieren intuitiv:

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

DoNothing () ist jedoch Mockitos Standardverhalten für void- Methoden.

Diese Version von whenAddCalledVerified () führt dasselbe aus wie die obige:

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

DoThrow () generiert eine Ausnahme:

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

Wir werden unten doAnswer () behandeln .

3. Argumenterfassung

Ein Grund, das Standardverhalten mit doNothing () zu überschreiben, besteht darin, Argumente zu erfassen.

Im obigen Beispiel haben wir die verify () -Methode verwendet, um die an add () übergebenen Argumente zu überprüfen .

Möglicherweise müssen wir jedoch die Argumente erfassen und etwas mehr damit anfangen.

In diesen Fällen verwenden wir doNothing () wie oben, jedoch mit einem 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. Beantworten eines Anrufs zur Leere

Eine Methode kann ein komplexeres Verhalten ausführen als nur das Hinzufügen oder Festlegen von Werten.

In diesen Situationen können wir Mockitos Antwort verwenden , um das gewünschte Verhalten hinzuzufügen:

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

Wie in Mockitos Java 8-Funktionen erläutert, verwenden wir ein Lambda mit Antwort , um das benutzerdefinierte Verhalten für add () zu definieren .

5. Teilweise Verspottung

Partial Mocks sind ebenfalls eine Option. Mockito des doCallRealMethod () kann verwendet werden für nichtig Methoden:

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

Auf diese Weise können wir die eigentliche Methode aufrufen und gleichzeitig überprüfen.

6. Fazit

In diesem kurzen Artikel haben wir vier verschiedene Methoden behandelt, um beim Testen mit Mockito auf leere Methoden zuzugreifen.

Wie immer sind die Beispiele in diesem GitHub-Projekt verfügbar.