Was ist der Unterschied zwischen andReturn(T value)
vs für EasyMock?EasyMock andReturn() vs andStubReturn()
In welcher Situation würden Sie andStubReturn()
verwenden, wo andReturn()
nicht das gleiche Ergebnis erzielen kann?
Was ist der Unterschied zwischen andReturn(T value)
vs für EasyMock?EasyMock andReturn() vs andStubReturn()
In welcher Situation würden Sie andStubReturn()
verwenden, wo andReturn()
nicht das gleiche Ergebnis erzielen kann?
Sie verwenden einen Stub-Rückgabewert für einen Methodenaufruf für den Schein, den Sie erwarten, aber ansonsten nicht interessiert sind. Sie verwenden eine normale Rückgabe für einen "normalen" Methodenaufruf.
Betrachten Sie die folgende Methode:
public void someMethod(String arg) {
if (logger.isDebugEnabled()) {
logger.debug("Calling doSomething() on service "
+ service.getName().hashCode());
}
service.postMessage("{" + arg + "}");
if (logger.isDebugEnabled()) {
logger.info("Finished calling doSomething() on service "
+ service.getName().hashCode());
}
}
... wo service
ein mockable Feld ist. Die hashCode()
Sache in den Log-Anweisungen ist erfunden, aber der Punkt ist, dass Ihr Mock muss auf eine beliebige Anzahl von Anrufen an getName()
zu reagieren, um eine NPE zu vermeiden, während Sie ansonsten nicht weniger kümmern könnte.
Wenn für diese Methode einen EasyMock Basis Unit-Test zu schreiben, würden Sie andStubReturn()
der Anruf an getName()
und eine normales andReturn()
für den Anruf zu postMessage(String)
verwenden. Wenn Sie das Mock-Objekt überprüfen, berücksichtigt es nur das letztere und Ihr Test bricht nicht ab, wenn Sie die log4j-Konfiguration ändern.
Eine zusätzliche Anmerkung für Klarheit.
Wenn Sie .andStubReturn() verwenden (oder wenn Sie .andReturn (foo) .anyTimes()) verwenden, wird es keine erwartete Mindestanzahl von Anrufen geben. Wenn Sie also eine falsche Erwartung setzen, indem Sie eine der beiden Methoden verwenden und die Mocked-Methode NICHT aufgerufen wird, wird der Aufruf .verify() nicht aktiviert.
Beispiel, das wird NICHT geltend machen, wenn die verspottete Methode nicht aufgerufen wird;
FooClass myFooClass = EasyMock.createNiceMock(FooClass.class);
EasyMock.expect(myFooClass.someMethod(EasyMock.anyInt()).andStubReturn(true);
EasyMock.replay(myFooClass);
EasyMock.verify(myFooClass);
Beispiel das WILL assert wenn die nachgeahmten Methode nicht aufgerufen wird;
FooClass myFooClass = EasyMock.createNiceMock(FooClass.class);
EasyMock.expect(myFooClass.someMethod(EasyMock.anyInt()).andReturn(true).atLeastOnce();
EasyMock.replay(myFooClass);
EasyMock.verify(myFooClass);
so lassen Sie mich sehen, ob ich das richtig verstehe. Grundsätzlich wird andStubReturn() für Methoden verwendet, die uns bei unserem Test für die Mock-Objekte nicht interessieren, aber wir müssen die Rückgabe verspotten, ansonsten funktioniert der Code nicht. Die Methoden andStubReturn() werden von EasyMock nicht verifiziert; während andReturn() Methoden verifiziert werden. – Glide
Das ist richtig. – Barend
Hallo, wird es dasselbe sein, AndReturn() mit zusätzlichen expectLastCall(). AnyTimes() zu verwenden? – damluar