Betrachten Sie diesen Code:
public class DummyClass {
public List<? extends Number> dummyMethod() {
return new ArrayList<Integer>();
}
}
public class DummyClassTest {
public void testMockitoWithGenerics() {
DummyClass dummyClass = Mockito.mock(DummyClass.class);
List<? extends Number> someList = new ArrayList<Integer>();
Mockito.when(dummyClass.dummyMethod()).thenReturn(someList); //Compiler complains about this
}
}
Der Compiler beschwert sich über die Zeile, für die versucht wird, das Verhalten zu stoppen dummyMethod()
. Gibt es Hinweise darauf, wie man Stubbing-Methoden durchführt, die einen Typ mit begrenzten Platzhaltern zurückgeben?
java
unit-testing
generics
mockito
bounded-wildcard
Shikhar Mishra
quelle
quelle
Antworten:
Zu diesem Zweck können Sie auch die nicht typsichere Methode doReturn verwenden.
wie in Mockitos Google-Gruppe besprochen .
Dies ist zwar einfacher als
thenAnswer
, aber beachten Sie erneut, dass es nicht typsicher ist. Wenn Sie sich Sorgen um die Typensicherheit machen, ist die Antwort von millhouse richtig.Weitere Details
Um klar zu sein, hier ist der beobachtete Compilerfehler:
Ich glaube, der Compiler hat während des
when
Aufrufs den ersten Platzhaltertyp zugewiesen und kann dann nicht bestätigen, dass der zweite Platzhaltertyp imthenReturn
Aufruf derselbe ist.Es sieht so aus, als würde
thenAnswer
dieses Problem nicht auftreten, da ein Platzhaltertyp akzeptiert wird, währendthenReturn
ein Nicht-Platzhaltertyp verwendet wird, der erfasst werden muss. Aus Mockitos OngoingStubbing ,quelle
Ich gehe davon aus, dass Sie in der Lage sein möchten,
someList
einige bekannte Werte zu laden . Hier ist ein Ansatz, derAnswer<T>
zusammen mit einer Vorlagen-Hilfsmethode verwendet wird, um alles typsicher zu machen:quelle
Ich habe gestern das Gleiche getroffen. Beide Antworten von @ nondescript1 und @millhouse haben mir geholfen, eine Problemumgehung zu finden. Ich habe so ziemlich den gleichen Code wie @millhouse verwendet, außer dass ich ihn etwas allgemeiner gemacht habe, weil mein Fehler nicht durch a verursacht wurde
java.util.List
, sondern durch dencom.google.common.base.Optional
. Meine kleine Hilfsmethode erlaubt daher jeden TypT
und nicht nurList<T>
:Mit dieser Hilfsmethode können Sie schreiben:
Dies kompiliert einwandfrei und macht das gleiche wie die
thenReturn(...)
Methode.Weiß jemand, ob der Fehler, den der Java-Compiler ausgibt, ein Compiler-Fehler ist oder ob der Code wirklich falsch ist?
quelle
Mockito.when(dummyClass.dummyMethod()).thenAnswer(x -> someList)
, also keine Notwendigkeit für die DienstprogrammmethodeIch verwandle den Kommentar von fikovnik hier in eine Antwort, um ihn besser sichtbar zu machen, da ich denke, dass dies die eleganteste Lösung mit Java 8+ ist.
In der Mockito-Dokumentation wird empfohlen,
doReturn()
(wie in der akzeptierten Antwort vorgeschlagen) nur als letzten Ausweg zu verwenden.Um den in der Frage beschriebenen Compilerfehler zu umgehen,
when()
kannthenAnswer()
stattdessen der empfohlene Mockito- Ansatz mit und einem Lambda (anstelle einer Hilfsmethode) verwendet werden:quelle
Obwohl die von Marek Radonsky vorgeschlagene Dienstprogrammmethode funktioniert, gibt es auch eine andere Option, für die nicht einmal der (meiner Meinung nach seltsam aussehende) Lambda-Ausdruck erforderlich ist, den fikovnik vorgeschlagen hat:
Wie diese Antwort auf eine ähnliche Frage zeigt, können Sie auch Folgendes verwenden:
quelle