Frage

Ich bin derzeit dabei, Mockito zu verwenden, um meine Service -Layer -Objekte in einer Spring MVC -Anwendung zu verspotten, in der ich meine Controller -Methoden testen möchte. Da ich jedoch die Besonderheiten von Mockito gelesen habe, habe ich festgestellt, dass die Methoden doReturn(...).when(...) ist äquivalent zu when(...).thenReturn(...). Meine Frage ist also, worum es geht, zwei Methoden zu haben, die dasselbe tun oder was der subtile Unterschied zwischen ist doReturn(...).when(...) und when(...).thenReturn(...)?

Jede Hilfe wäre geschätzt.

War es hilfreich?

Lösung

Die beiden Syntaxe für Stubbing sind ungefähr gleichwertig. Sie können jedoch stets verwenden doReturn/when für Stummel; Aber es gibt Fälle, in denen Sie kippen verwenden when/thenReturn. Stumpfe Leermethoden sind eine solche. Andere umfassen die Verwendung mit Mockito -Spione und das Stubieren der gleichen Methode mehr als einmal.

Eine Sache, die when/thenReturn Gibt dir das, das doReturn/when Ist es nicht die Typ-Überprüfung des Wertes, den Sie zurückgeben, zum Kompilierzeit. Ich glaube jedoch, dass dies fast keinen Wert hat - wenn Sie den Typ falsch haben, werden Sie herausfinden, sobald Sie Ihren Test durchführen.

Ich empfehle dringend nur zu verwenden doReturn/when. Es macht keinen Sinn, zwei Syntaxe zu lernen, wenn man es tut.

Vielleicht möchten Sie sich auf meine Antwort beziehen Mockito "Grammatiken" bilden - Eine detailliertere Antwort auf eine sehr eng verwandte Frage.

Andere Tipps

Beide Ansätze verhalten sich anders, wenn Sie ein ausgespioniertes Objekt verwenden (kommentiert mit @Spy) anstelle eines Scheins (mit Annotation mit @Mock):

  • when(...) thenReturn(...) macht einen echten Methodenaufruf Kurz vor dem angegebenen Wert wird zurückgegeben. Wenn die aufgerufene Methode eine Ausnahme ausgelegt hat, müssen Sie sich damit befassen / verspotten usw. Natürlich erhalten Sie immer noch Ihr Ergebnis (was Sie in definitiv definieren thenReturn(...))

  • doReturn(...) when(...) ruft die Methode überhaupt nicht auf.

Beispiel:

public class MyClass {
     protected String methodToBeTested() {
           return anotherMethodInClass();
     }

     protected String anotherMethodInClass() {
          throw new NullPointerException();
     }
}

Prüfen:

@Spy
private MyClass myClass;

// ...

// would work fine
doReturn("test").when(myClass).anotherMethodInClass();

// would throw a NullPointerException
when(myClass.anotherMethodInClass()).thenReturn("test");

Der Mockito Javadoc scheint zu sagen, warum sie verwendet werden doReturn() Anstatt von when()Verwenden Sie Doreturn () in diesen seltenen Fällen, wenn Sie Mockito nicht verwenden können.

Achten Sie darauf, dass Mockito.Wenn (Objekt) immer für Stubbing empfohlen wird, da es sich um Argument-Typ-Safe und lesbarer handelt (insbesondere bei Stubbing-Aufrufen).

Hier sind diese seltenen Gelegenheiten, in denen Doreturn () nützlich ist:

1. Wenn wir reale Objekte ausspionieren und echte Methoden auf einem Spion aufrufen

List list = new LinkedList(); List spy = spy(list);

// unmöglich: Real Methode wird so spy genannt.

when(spy.get(0)).thenReturn("foo");

// Sie müssen Doreturn () für Stubbing verwenden: doReturn("foo").when(spy).get(0);

2. Übergeordnet ein früherer Ausnahmemittel:

when(mock.foo()).thenThrow(new RuntimeException());

// unmöglich: Die ausnahmebedingte FOO () -Methode wird so genannt, dass RunTimeException ausgeworfen wird. when(mock.foo()).thenReturn("bar");

// Sie müssen Doreturn () für Stubbing verwenden:

doReturn("bar").when(mock).foo(); Oben Szenarien zeigt einen Kompromiss mit Mockitos eleganter Syntax. Beachten Sie jedoch, dass die Szenarien jedoch sehr selten sind. Das Spionieren sollte sporadisch sein und übergeordnetes Ausnahmemittel ist sehr selten. Ganz zu schweigen davon, dass im Allgemeinen Stubbing ein potenzieller Codegeruch ist, der zu viel Stubbing hinweist.

Auch weiterhin Diese Antwort, Es gibt einen weiteren Unterschied, dass Sie, wenn Ihre Methode beispielsweise verschiedene Werte zurückgibt, wenn sie zum ersten Mal aufgerufen wird, das zweite Mal usw. genannt werden, Sie beispielsweise die Werte übergeben können ...

PowerMockito.doReturn(false, false, true).when(SomeClass.class, "SomeMethod", Matchers.any(SomeClass.class));

Es wird also falsch zurückgeführt, wenn die Methode in demselben Testfall aufgerufen wird, und dann wieder falsch und zuletzt wahr.

Die letztere Alternative wird für Methoden für Mocks verwendet, die zurückkehren void.

Bitte schauen Sie sich zum Beispiel hier an:Wie man Mock to void Methoden mit Mockito macht

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top