Jaka jest różnica między używaniem andReturn(T value)
vs andStubReturn(T value)
dla EasyMock?EasyMock andReturn() vs andStubReturn()
W jakiej sytuacji używałbyś andStubReturn()
, gdzie andReturn()
nie może osiągnąć tego samego wyniku?
Jaka jest różnica między używaniem andReturn(T value)
vs andStubReturn(T value)
dla EasyMock?EasyMock andReturn() vs andStubReturn()
W jakiej sytuacji używałbyś andStubReturn()
, gdzie andReturn()
nie może osiągnąć tego samego wyniku?
Używa się krótkiego powrotu do wywołania metody na próbę, że spodziewasz się, ale nie są zainteresowani w inny sposób. Używasz regularnego powrotu do "zwykłego" wywołania metody.
Rozważmy następującą metodę:
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());
}
}
... gdzie service
jest pole mockable. Sprawa hashCode()
w instrukcjach logów jest wymyślona, ale chodzi o to, że twoja próba musi odpowiadać na dowolną liczbę połączeń z numerem getName()
, aby uniknąć NPE, podczas gdy w inny sposób nie mógłbyś się tym przejmować.
Podczas pisania testów jednostkowych EasyMock oparte na tej metodzie, to bym andStubReturn()
wywołanie getName()
i użyć zwykłego andReturn()
na wezwanie do postMessage(String)
. Kiedy zweryfikujesz próbny obiekt, będzie on uwzględniał tylko ten drugi i twój test nie zostanie złamany, jeśli zmienisz konfigurację log4j.
Dodatkowa uwaga dla większej przejrzystości.
Jeśli użyjesz funkcji .andStubRec() (lub jeśli użyjesz .andReturn (foo). AnyTimes()), nie będzie minimalnej oczekiwanej liczby połączeń. Jeśli więc ustawisz fałszywe oczekiwanie za pomocą jednego z tych dwóch elementów, a wyśmiewana metoda NIE zostanie wywołana, wywołanie .verify() nie potwierdzi.
Przykład, który będzie NOT potwierdzać, gdy metoda nie jest wywoływana;
FooClass myFooClass = EasyMock.createNiceMock(FooClass.class);
EasyMock.expect(myFooClass.someMethod(EasyMock.anyInt()).andStubReturn(true);
EasyMock.replay(myFooClass);
EasyMock.verify(myFooClass);
Przykład że CZY dochodzić gdy szydzili metoda nie jest wywoływana;
FooClass myFooClass = EasyMock.createNiceMock(FooClass.class);
EasyMock.expect(myFooClass.someMethod(EasyMock.anyInt()).andReturn(true).atLeastOnce();
EasyMock.replay(myFooClass);
EasyMock.verify(myFooClass);
Pozwól mi zobaczyć, czy rozumiem to poprawnie. Zasadniczo metoda andStubReklam() jest używana dla metod, których nie obchodzi nasz test na pozorowane obiekty, ale musimy kpić z powrotu, w przeciwnym razie kod nie będzie działać. Metody andStubRec() nie są weryfikowane przez EasyMock; metody andReturn() są weryfikowane. – Glide
To prawda. – Barend
Witam, czy to samo będzie używać andReturn() z dodatkowym expectLastCall(). AnyTimes()? – damluar