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!