Ich bin derzeit dabei, Mockito zum Verspotten meiner Service-Layer-Objekte in einer Spring MVC-Anwendung zu verwenden, in der ich meine Controller-Methoden testen möchte. Als ich jedoch über die Besonderheiten von Mockito gelesen habe, habe ich festgestellt, dass die Methoden doReturn(...).when(...)
äquivalent zu sind when(...).thenReturn(...)
. Meine Frage ist also, was bringt es, zwei Methoden zu haben, die dasselbe tun, oder was ist der subtile Unterschied zwischen doReturn(...).when(...)
und when(...).thenReturn(...)
?
Jede Hilfe wäre dankbar.
java
unit-testing
mockito
schwarzer Panther
quelle
quelle
doReturn()
nützlich ist.Antworten:
Die beiden Syntaxen für das Stubbing sind ungefähr gleichwertig. Sie können jedoch immer verwenden
doReturn/when
für Anstoßen; Es gibt jedoch Fälle, in denen Sie nicht verwenden könnenwhen/thenReturn
. Das Stubben von Hohlraummethoden ist eine solche. Andere beinhalten die Verwendung mit Mockito-Spionen und das mehrmalige Stubben derselben Methode.Eine Sache,
when/thenReturn
die Ihnen dasdoReturn/when
gibt, ist die Typprüfung des Wertes, den Sie zur Kompilierungszeit zurückgeben. Ich glaube jedoch, dass dies fast keinen Wert hat - wenn Sie den Typ falsch angegeben haben, werden Sie es herausfinden, sobald Sie Ihren Test ausführen.Ich empfehle dringend nur zu verwenden
doReturn/when
. Es macht keinen Sinn, zwei Syntaxen zu lernen, wenn eine ausreicht.Vielleicht möchten Sie sich auf meine Antwort unter Forming Mockito "Grammatiken" beziehen - eine detailliertere Antwort auf eine sehr eng verwandte Frage.
quelle
doReturn/when
und die nächsten Minuten damit verbringe, herauszufinden, was schief gelaufen ist. Die Überprüfung des Kompiliertyps wird mit äußerst nützlichwhen/thenReturn
.when/thenReturn
anstelle von empfiehltdoReturn/when
.doReturn/when
ein Kompromiss ist. Das Team empfiehlt nicht auf die eine oder andere Weise, stellt jedoch fest, dass derwhen/then
Ansatz intuitiver und lesbarer ist und eine Überprüfung der Kompilierungszeit bietet. Dieser Ansatz hat Mockito populär und benutzerfreundlich gemacht. Vergessen Sie dies nicht, wenn die Codebasis von gemeinsam genutzt wird verschiedene Fähigkeiten in Ihrem Team; Dennoch hat es Nachteile in Bezug auf Spione und Leermethoden.doReturn()
den großen Nachteil, dass Methodenaufrufe im YODA-Stil codiert werden. Die Sache wird später als erstes aufgeschrieben. Die meisten Leute lesen von links nach rechts; Sie müssen jetzt ständig daran denken, die Return-When-Logik in Ihrem Kopf umzukehren.Beide Ansätze verhalten sich unterschiedlich, wenn Sie ein Spionageobjekt (mit Anmerkungen versehen
@Spy
) anstelle eines Scheinobjekts (mit Anmerkungen versehen@Mock
) verwenden:when(...) thenReturn(...)
führt einen echten Methodenaufruf durch, kurz bevor der angegebene Wert zurückgegeben wird. Wenn die aufgerufene Methode eine Ausnahme auslöst, müssen Sie sich damit befassen / sie verspotten usw. Natürlich erhalten Sie immer noch Ihr Ergebnis (was Sie in definierenthenReturn(...)
).doReturn(...) when(...)
ruft die Methode überhaupt nicht auf .Beispiel:
Prüfung:
quelle
doReturn()
, es sieht aus wie ein Missbrauch der Bibliothek. Der Sinn des Spionierens statt des reinen Verspottens besteht darin, echte Anrufe zu nutzen. Sie warnen auch davor, Spies wie diesen zu verwenden: github.com/mockito/mockito/wiki/Using-Spies-(and-Fakes) (und empfehlen, die Klasse zu erweitern und stattdessen die Methode zu überschreiben)Das Mockito-Javadoc scheint zu erklären , warum in den seltenen Fällen, in denen Sie Mockito.when (Object) nicht verwenden können, doReturn ()
doReturn()
anstelle vonwhen()
Use doReturn () verwendet wird.quelle
Wenn Sie diese Antwort fortsetzen , gibt es einen weiteren Unterschied: Wenn Sie möchten, dass Ihre Methode unterschiedliche Werte zurückgibt, z. B. beim ersten Aufruf, beim zweiten Aufruf usw., können Sie beispielsweise Werte übergeben ...
Es wird also false zurückgegeben, wenn die Methode im selben Testfall aufgerufen wird, und dann wird false erneut und zuletzt true zurückgegeben.
quelle
Die letztere Alternative wird für Methoden für Mocks verwendet, die zurückkehren
void
.Schauen Sie sich zum Beispiel hier an: Wie man mit mockito Methoden zum Verspotten macht, um sie zu entleeren
quelle