2010-09-18 11 views
49

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?

Odpowiedz

52

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.

+8

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

+1

To prawda. – Barend

+0

Witam, czy to samo będzie używać andReturn() z dodatkowym expectLastCall(). AnyTimes()? – damluar

5

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); 
Powiązane problemy