5.1 Die verify()-Methode
Neben der Erstellung virtueller Objekte stellt sich oft noch eine weitere interessante Aufgabe: sicherzustellen, dass die zu testende Klasse die richtigen Methoden der richtigen Objekte aufruft. Darüber hinaus rief er die erforderliche Anzahl von Malen mit den richtigen Parametern usw. an.
Dafür verfügt Mockito auch über etwas Zauberhaftes – eine Methodenfamilie Mockito.verify(…)
. Die allgemeine Regel zur Festlegung der Methodenaufrufprüfung lautet:
Mockito.verify(ein Objekt).Methodenname(Parameter);
Beispiel:
@ExtendWith(MockitoExtension.class)
class VerifyTest {
@Mock
List<String> mockList;
@Test
public void whenMockAnnotation() {
//Methodenaufruf
String name = mockList.get(10);
// Überprüfen Sie, ob die Methode aufgerufen wurde
Mockito.verify(mockList).get(10);
}
}
Beim Methodenaufruf verify()
legen wir die Regel fest, dass mockitoList
die Methode mit dem Parameter 10 auf dem Objekt aufgerufen werden soll get()
.
5.2 Die Methode verify() mit Überprüfung der Anzahl der Aufrufe
Manchmal gibt es komplexere Verifizierungsszenarien. Sie müssen beispielsweise nicht nur überprüfen, ob die Methode aufgerufen wurde, sondern beispielsweise auch, ob sie dreimal aufgerufen wurde. Oder es wurde in einem Zyklus von Ihnen aufgerufen und hätte daher N-mal aufgerufen werden müssen.
Wir werden nicht fragen, ob dies möglich ist, sondern sofort fragen: Wie schreibt man eine solche Regel auf? Und wieder lässt uns Mockito nicht im Stich. Die Regel kann wie folgt angegeben werden:
Mockito.verify(ein Objekt,Menge).Methodenname(Parameter);
Wichtig! Menge ist kein Typ int
, sondern ein spezielles Objekt, das verschiedene Muster definieren kann. Erinnern Sie sich an die verschiedenen Versionen der Methode any()
? Auch hier ist es das Gleiche – es gibt spezielle Methoden, mit denen Sie verschiedene Szenarien einstellen können:
Methode | Beschreibung | |
---|---|---|
1 | niemals() | Die Methode sollte niemals aufgerufen werden |
2 | mal(n) | n mal |
3 | mindestens(n) | n oder öfter |
4 | mindestens einmal() | 1 oder mehrmals |
5 | atMost(n) | n oder weniger Mal |
6 | nur() | Es sollte nur einen Aufruf und nur diese Methode geben |
Beispiel:
String name1 = mockList.get(1); //Methodenaufruf
String name2 = mockList.get(2); //Methodenaufruf
String name3 = mockList.get(3); //Methodenaufruf
//Überprüfen Sie, ob die get()-Methode dreimal aufgerufen wurde
Mockito.verify(mockList, times(3)).get(anyInt());
Sie können auch verlangen, dass außer den angegebenen Methodenaufrufen keine weiteren Verweise auf das Objekt erfolgen . Dafür gibt es eine Regel:
Mockito.verifyNoMoreInteractions(ein Objekt);
5.3 Reihenfolge des Methodenaufrufs
Die bisherigen Regeln regelten in keiner Weise die Reihenfolge der Methodenaufrufe. Die Regel muss nur erfüllt werden und das war's. Aber es gibt Situationen, in denen die Reihenfolge der Methodenaufrufe wichtig ist, und Mockito hat auch hierfür eine Lösung.
Mithilfe eines speziellen Objekts kann eine strikte Reihenfolge der Methodenaufrufe festgelegt werden InOrder
. Zuerst müssen Sie es erstellen:
InOrder inOrder = Mockito.inOrder(ein Objekt);
Und fügen Sie dann Regeln hinzu, indem Sie Methoden aufrufen verify()
.
Beispiel:
List<String> mockedList = mock(MyList.class);
mockedList.size();
mockedList.add("a parameter");
mockedList.clear();
InOrder inOrder = Mockito.inOrder(mockedList);
inOrder.verify(mockedList).size();
inOrder.verify(mockedList).add("a parameter");
inOrder.verify(mockedList).clear();
5.4 Ausnahmen in Mockito prüfen
Die Tatsache, dass Ausnahmen ausgelöst wurden, wird etwas anders überprüft. Verwenden Sie dazu die Methode assertThrows()
. Das allgemeine Format für eine solche Prüfung ist:
Assertions.assertThrows(Ausnahmeklasse, () -> ein Objekt.Methodenname());
Nichts Kompliziertes.
Beispiel:
@ExtendWith(MockitoExtension.class)
class ThenThrowTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation() {
//das Verhalten der Methode festlegen (wird nur zu Demonstrationszwecken benötigt)
Mockito.when(mockList.size()).thenThrow(IllegalStateException.class);
//Überprüfen Sie, ob beim Aufruf der Größenmethode eine IllegalStateException ausgelöst wird
assertThrows(IllegalStateException.class, () -> mockList.size());
}
}
GO TO FULL VERSION