Seit Java 8 können Sie die argumentlose any
Methode verwenden, und das Typargument wird vom Compiler abgeleitet:
verify(bar).doStuff(any());
Erläuterung
Das Neue in Java 8 ist, dass der Zieltyp eines Ausdrucks verwendet wird, um Typparameter seiner Unterausdrücke abzuleiten. Vor Java 8 wurden nur Argumente für Methoden verwendet, die für die Inferenz von Typparametern verwendet wurden (meistens).
In diesem Fall ist der Parametertyp von doStuff
der Zieltyp für any()
, und der Rückgabewerttyp von any()
wird entsprechend diesem Argumenttyp ausgewählt.
Dieser Mechanismus wurde in Java 8 hauptsächlich hinzugefügt, um Lambda-Ausdrücke kompilieren zu können, verbessert jedoch allgemein die Typinferenzen.
Primitive Typen
Dies funktioniert leider nicht mit primitiven Typen:
public interface IBar {
void doPrimitiveStuff(int i);
}
verify(bar).doPrimitiveStuff(any()); // Compiles but throws NullPointerException
verify(bar).doPrimitiveStuff(anyInt()); // This is what you have to do instead
Das Problem ist, dass der Compiler Integer
als Rückgabewert von ableitet any()
. Mockito ist sich dessen nicht bewusst (aufgrund der Typlöschung) und gibt den Standardwert für Referenztypen zurück null
. Die Laufzeit versucht, den Rückgabewert zu entpacken, indem sie die intValue
Methode aufruft , bevor sie an übergeben wird doStuff
, und die Ausnahme wird ausgelöst.
any
Methode einfach funktionieren sollte. Sie suchen keine Antwort für Dinge, die nur funktionieren!any()
aber in Ordnung waranyBoolean()
, was der letzte Teil Ihrer Antwort wunderschön beleuchtet.Das sollte funktionieren
quelle
verify(bar).DoStuff(any[Array[Foo]])
Sie können dafür verwenden
Mockito.isA()
:http://site.mockito.org/mockito/docs/current/org/mockito/Matchers.html#isA(java.lang.Class)
quelle
Da ich diese Funktion für mein aktuelles Projekt verwenden musste (an einem Punkt haben wir von 1.10.19 aktualisiert), nur um die Benutzer (die bereits die Mockito-Core-Version 2.1.0 oder höher verwenden ) auf dem neuesten Stand zu halten, die statische Methoden aus den obigen Antworten sollten aus der
ArgumentMatchers
Klasse entnommen werden :Bitte beachten Sie dies, wenn Sie planen, Ihre Mockito-Artefakte auf dem neuesten Stand zu halten, da diese Klasse möglicherweise ab Version 3 verfügbar ist. Diese Klasse existiert möglicherweise nicht mehr:
Ab 2.1.0 gibt Javadoc von org.mockito.Matchers Folgendes an:
Ich habe einen kleinen Artikel über Mockito-Wildcards geschrieben, wenn Sie weiterlesen möchten .
quelle