So passen Sie die an den Parameter der Klasse <T> übergebene Null mit Mockito an

83

Ich habe Methoden wie diese:

public <T> method(String s, Class<T> t) {...}

Dass ich überprüfen muss, ob dies nullan das zweite Argument übergeben wird, wenn Matcher für die anderen Parameter verwendet werden, habe ich folgendermaßen ausgeführt:

@SuppressWarnings("unchecked")
verify(client).method(eq("String"), any(Class.class));

Aber gibt es einen besseren Weg (ohne Warnungen zu unterdrücken)? Tstellt den Rückgabetyp einer anderen Methode dar, die manchmal voidund in diesen Fällen übergeben nullwird.

leer
quelle
Hast du es versucht null(statt any(Class.class))?
Andy
1
Das Problem ist, wenn Sie Matcher für die anderen Parameter verwenden - Sie müssen Matcher für alle verwenden
leer

Antworten:

40

Update von David Wallaces Antwort:

Ab 2016-12, Java 8 und Mockito 2.3,

public static <T> T isNull(Class<T> clazz)

ist veraltet und wird in Mockito 3.0 entfernt

verwenden

public static <T> T isNull()

stattdessen

Mike Nagetier
quelle
4
Das wird nicht 100% funktionieren, ich muss jetzt die Klasse wie folgt besetzen, (Integer) isNull()anstatt isNull( Integer.class ).
Henrique de Sousa
4
Die Syntax, um zu vermeiden, dass hier eine Besetzung erforderlich ist, lautetorg.mockito.Mockito.<String>isNull()
Del
143

Mockito hat einen isNullMatcher , bei dem Sie den Namen der Klasse eingeben können. Wenn Sie es also mit anderen Matchern verwenden müssen, ist das Richtige

verify(client).method(eq("String"),isNull(Class<?>.class));

Dies ist jetzt veraltet. Die neue Methode finden Sie in der folgenden Antwort: https://stackoverflow.com/a/41250852/1348

Dawood ibn Kareem
quelle
7
Es ist zu beachten, dass Sie für Zeichenfolgen verwenden müssen (String) isNull().
Mike Rylander
2
Ja. isNull(String.class)und (String) isNull()sind gleichwertig. Gehen Sie mit dem, was für Sie sinnvoller ist.
Dawood ibn Kareem
@mikerodent Danke für die vorgeschlagene Bearbeitung. Du liegst absolut richtig. Aber Sie sollten Ihren Vorschlag wahrscheinlich als neue Antwort veröffentlichen, anstatt meinen zu bearbeiten. Also habe ich Ihre Bearbeitung abgelehnt, obwohl ich damit vollkommen einverstanden bin.
Dawood ibn Kareem
1
OK! Ich verstehe nicht ganz warum, aber ich verneige mich vor Ihrem weit überlegenen Wissen über das SO-Protokoll!
Mike Nagetier
1
Ich verstehe auch nicht warum. Sicherlich sollte sich eine bevorstehende API-Änderung in dieser Antwort irgendwie widerspiegeln, niemand scrollt nach unten :)
leer
20

Das funktioniert bei mir:

verify(client).method(eq("String"), eq((Class<?>) null));
Eric
quelle
2
Vielen Dank! Ich denke nie daran, null zu werfen ... bye bye @SuppressWarnings
leer