Ich habe versucht, eine Methode mit vararg-Parametern mit Mockito zu verspotten:
interface A {
B b(int x, int y, C... c);
}
A a = mock(A.class);
B b = mock(B.class);
when(a.b(anyInt(), anyInt(), any(C[].class))).thenReturn(b);
assertEquals(b, a.b(1, 2));
Dies funktioniert jedoch nicht, wenn ich dies stattdessen tue:
when(a.b(anyInt(), anyInt())).thenReturn(b);
assertEquals(b, a.b(1, 2));
Dies funktioniert, obwohl ich das Argument varargs beim Stubben der Methode vollständig weggelassen habe.
Irgendwelche Hinweise?
java
mocking
variadic-functions
mockito
qualidafial
quelle
quelle
Antworten:
Mockito 1.8.1 hat einen beliebigen Vararg () - Matcher eingeführt :
Siehe auch den Verlauf dazu: https://code.google.com/archive/p/mockito/issues/62
Bearbeiten Sie die neue Syntax nach dem Veralten:
quelle
anyVararg()
hat Object als Rückgabetyp. Führen Sie ein explizites Casting durch, um es mit allen var arg-Typen (z. B. String ..., Integer ... usw.) kompatibel zu machen. Wenn Sie zum Beispiel habendoSomething(Integer number, String ... args)
, können Sie den Mock / Stub-Code mit so etwas wie machenwhen(mock).doSomething(eq(1), (String) anyVarargs())
. Das sollte den Kompilierungsfehler beheben.Matchers
ist jetzt veraltet, um einen Namenskonflikt mit derorg.hamcrest.Matchers
Klasse zu vermeiden, und wird wahrscheinlich in mockito v3.0 entfernt. Verwenden SieArgumentMatchers
stattdessen.Eine etwas undokumentierte Funktion: Wenn Sie einen benutzerdefinierten Matcher entwickeln möchten, der mit vararg-Argumenten übereinstimmt, müssen Sie ihn implementieren,
org.mockito.internal.matchers.VarargMatcher
damit er ordnungsgemäß funktioniert. Es ist eine leere Markierungsschnittstelle, ohne die Mockito Argumente beim Aufrufen einer Methode mit varargs unter Verwendung Ihres Matchers nicht korrekt vergleicht.Beispielsweise:
quelle
Aufbauend auf Eli Levines Antwort ist hier eine allgemeinere Lösung:
Dann können Sie es mit den Array-Matchern von hamcrest folgendermaßen verwenden:
(Offensichtlich machen statische Importe dies lesbarer.)
quelle
Ich habe den Code in Peter Westmacotts Antwort verwendet, aber mit Mockito 2.2.15 können Sie jetzt Folgendes tun:
verify(a).method(100L, arg1, arg2, arg3)
Wo
arg1, arg2, arg3
sind Varargs?quelle
Aufbauend auf der Antwort von topchef,
Für 2.0.31-beta musste ich Mockito.anyVararg anstelle von Matchers.anyVararrg verwenden:
quelle
In meinem Fall lautet die Signatur der Methode, deren Argument ich erfassen möchte:
In diesem Fall sollten Sie das Byte-Array explizit umwandeln :
Ich benutze die Mockito-Version
1.10.19
quelle
Sie können auch die Argumente durchlaufen:
Überprüfen Sie beispielsweise ihre Typen und setzen Sie sie entsprechend um, fügen Sie sie einer Liste hinzu oder was auch immer.
quelle
Anpassen der Antwort von @topchef,
Gemäß den Java-Dokumenten für Mockito 2.23.4 stimmt Mockito.any () mit allem überein, einschließlich Nullen und Varargs.
quelle
Sie können dies erreichen, indem Sie ein ArgumentCaptor-Capture übergeben und die Varargs dann mit "getAllValues" als Liste abrufen (siehe: https://stackoverflow.com/a/55621731/11342928)
quelle