webentwicklung-frage-antwort-db.com.de

So überprüfen Sie, dass die gemeldete Methode mit keiner Kombination von Parametern mit Mockito aufgerufen wird

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.

36
Dan King

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.

68
Matt Lachman

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. 

13

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);
0
manindra naresh