Wie kann ich mit Mockito verifizieren, dass eine gespielte Methode überhaupt nicht mit einer Kombination von Parametern aufgerufen wurde?
Zum Beispiel habe ich ein Objekt - myObject
-, das ein zweites, verspottetes Objekt - myMockedOtherObject
- verwendet, das eine Methode - someMethodOrOther(String parameter1, String parameter2)
hat.
Ich möchte myObject.myMethod()
aufrufen und überprüfen, ob someMethodOrOther()
nicht aufgerufen wird - mit any Kombination von Parametern.
z.B.:
myObject.doSomeStuff();
verify(myMockedOtherObject, never()).someMethodOrOther();
Außer dass ich das nicht tun kann, weil someMethodOrOther()
die Angabe bestimmter Parameter erfordert.
Mit den Argument-Matchern von Mockito können Sie erreichen, was Sie wollen:
myObject.doSomeStuff();
verify(myMockedOtherObject, never()).someMethodOrOther(
Mockito.anyString(),
Mockito.anyString()
);
Natürlich können Sie dies mit einem statischen Import etwas weniger ausführlich machen, wie Sie es für verify
und never
haben.
Sie müssen Argumentvergleicher verwenden, um solche Dinge auszuführen. Sie geben ein Argument Matcher an, das jedem Parameter in Ihrer Methode entspricht, Sie müssen jedoch sicherstellen, dass Sie einen Parameter mit dem richtigen Typ auswählen. Alle, die Sie wahrscheinlich benötigen werden, sind unter http://docs.mockito.googlecode.com/hg/latest/org/mockito/Matchers.html aufgelistet.
Angenommen, Ihre Methode ist
public void myMethod(
String text, int count, MyClass something, List<MyClass> someList) {
// ...
}
Ihre Bestätigungsaussage könnte so aussehen.
verify(myMock, never()).myMethod(
anyString(), anyInt(), any(MyClass.class), anyListOf(MyClass.class));
Einige der Matcher, die Sie wahrscheinlich brauchen werden, sind -
anyInt(), anyLong(), anyShort(), anyBoolean(), anyByte(), anyChar(), anyFloat(), anyDouble()
- Diese stimmen entweder mit der Grundversion oder der Objektversion jedes dieser Typen überein. In meinem Beispiel habe ich anyInt()
verwendet, um eine int
zu finden, aber es wird auch eine Integer
angezeigt.any(XXX.class)
- Dies passt zu jedem Objekttyp. In meinem Beispiel habe ich es verwendet, um eine MyClass
zu finden.anyString()
- Dies ist eine alternative Schreibweise any(String.class)
anyListOf(XXX.class), anySetOf(XXX.class), anyMapOf(XXX.class, XXX.class)
- Diese Optionen eignen sich für die Übereinstimmung mit den standardmäßigen generischen Sammlungstypen. In meinem Beispiel habe ich anyListOf
verwendet, um den List<MyClass>
abzugleichen.Es gibt noch eine Handvoll anderer, und ich empfehle dringend, sich kurz durch den Javadoc zu bewegen. Dies sind jedoch diejenigen, die Sie am wahrscheinlichsten mit never()
verwenden.
Klarere Art, die Lösung zu präsentieren
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.never;
//Testing scenario
verify(mockObject, never()).someMethod(mockParam1, MockParam2);