Ich versuche, alten Code mit Mockito zu testen.
Ich möchte einen Stub FooDao
, der in der Produktion verwendet wird, wie folgt verwenden:
foo = fooDao.getBar(new Bazoo());
Ich kann schreiben:
when(fooDao.getBar(new Bazoo())).thenReturn(myFoo);
Das offensichtliche Problem ist jedoch, dass getBar()
niemals mit demselben Bazoo
Objekt aufgerufen wird, für das ich die Methode abgestubbt habe. (Verfluche diesen new
Operator!)
Ich würde es lieben, wenn ich die Methode so stubben könnte, dass sie myFoo
unabhängig vom Argument zurückgegeben wird. Andernfalls höre ich mir andere Vorschläge zur Problemumgehung an, möchte aber wirklich vermeiden, den Produktionscode zu ändern, bis eine angemessene Testabdeckung vorliegt.
quelle
notNull(Bazoo.class)
genau wie dieany(Bazoo.class)
(vielleicht gab es sie zum Zeitpunkt dieser Antwort nicht)Bazoo
oderCazoo
die beide Unterklassen von beispielsweise sindAzoo
. dennBazoo
ich musste zurückkehrenfoo
, aberCazoo
ich musste zurückkehrenbar
. In dieser SituationMatchers.any()
funktioniert die vorgeschlagene Lösung nicht, funktioniert jedochMatchers.isA()
perfekt.org.mockito.Matchers
ist jetzt veraltet - verwenden Sieorg.mockito.ArgumentMatchers
stattdessen, dhimport static org.mockito.ArgumentMatchers.*
(siehe Dokumente )when(myFoo.knowsWhatsUp()).thenReturn(myMoney);
Verwenden Sie wie folgt:
Bevor Sie importieren müssen
Mockito.Matchers
quelle
http://site.mockito.org/mockito/docs/1.10.19/org/mockito/Matchers.html
anyObject()
sollte Ihren Bedürfnissen entsprechen.Sie können auch immer in Betracht ziehen,
hashCode()
undequals()
für dieBazoo
Klasse zu implementieren . Dadurch funktioniert Ihr Codebeispiel wie gewünscht.quelle
Eine andere Möglichkeit ist, sich auf eine gute altmodische
equals
Methode zu verlassen. Solange das Argument imwhen
Mock mitequals
dem Argument im zu testenden Code übereinstimmt, stimmt Mockito mit dem Mock überein.Hier ist ein Beispiel.
Wenn Sie dann wissen, wofür der Wert sein
someField
wird, können Sie ihn so verspotten.Profis: Dies ist expliziter als
any
Matcher. Als Prüfer von Code halte ich ein Auge offen fürany
den Code, den Junior-Entwickler schreiben, da er einen Blick auf die Logik ihres Codes wirft, um das entsprechende Objekt zu generieren, das übergeben wird.con: Manchmal ist das Feld, das an das Objekt übergeben wird, eine zufällige ID. In diesem Fall können Sie das erwartete Argumentobjekt nicht einfach in Ihrem Scheincode erstellen.
Ein anderer möglicher Ansatz ist die Verwendung von Mockitos
Answer
Objekt, das mit derwhen
Methode verwendet werden kann.Answer
Mit dieser Option können Sie den tatsächlichen Aufruf abfangen, das Eingabeargument überprüfen und ein Scheinobjekt zurückgeben. Im folgenden Beispielany
fange ich jede Anfrage an die verspottete Methode ab. Aber dannAnswer
kann ich im Lambda das Bazo-Argument weiter untersuchen ... vielleicht um zu überprüfen, ob ihm ein korrekter Ausweis übergeben wurde. Ich ziehe diesany
allein vor, damit zumindest eine gewisse Prüfung des Arguments durchgeführt wird.Um es zusammenzufassen, ich verlasse mich gerne darauf
equals
(wo das erwartete Argument und das tatsächliche Argument gleich sein sollten) und wenn Gleichheit nicht möglich ist (weil ich den Zustand des tatsächlichen Arguments nicht vorhersagen kann), greife ich zurück auf ,Answer
um das Argument zu untersuchen.quelle