2010-09-18 17 views
49

Qual è la differenza tra l'utilizzo di andReturn(T value) rispetto a andStubReturn(T value) per EasyMock?EasyMock andReturn() vs andStubReturn()

In quale situazione si utilizzerà andStubReturn() dove andReturn() non può ottenere lo stesso risultato?

risposta

52

Si utilizza un ritorno stub per una chiamata di metodo sul mock che si prevede che si verifichi ma non è altrimenti interessato. Si utilizza un ritorno normale per una chiamata di metodo "normale".

Si consideri il seguente metodo:

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()); 
    } 
} 

... dove service è un campo mockable. La cosa hashCode() nelle istruzioni del registro è inventata, ma il punto è che il tuo mock deve rispondere a un numero qualsiasi di chiamate a getName() per evitare un NPE, mentre altrimenti non ci si potrebbe importare di meno.

Quando si scrive un test di unità basata EasyMock per questo metodo, ci si andStubReturn() la chiamata a getName() e utilizzare un normale andReturn() per la chiamata a postMessage(String). Quando si verifica l'oggetto fittizio, verrà preso in considerazione solo quest'ultimo e il test non si interromperà se si modifica la configurazione di log4j.

+8

quindi fammi vedere se ho capito bene. Fondamentalmente andStubReturn() è usato per metodi che non ci interessano per il nostro test per gli oggetti mock, ma siamo tenuti a prendere in giro il ritorno altrimenti, il codice non funzionerà. I metodi andStubReturn() non sono verificati da EasyMock; mentre i metodi andReturn() sono verificati. – Glide

+1

Questo è corretto. – Barend

+0

Ciao, sarà lo stesso usare eReturn() con expectLastCall(). AnyTimes()? – damluar

5

Un'ulteriore nota per chiarezza.

Se si utilizza .andStubReturn() (o se si utilizza .andReturn (foo) .anyTimes()), non ci sarà un numero minimo di chiamate previsto. Quindi, se si imposta un'aspettativa simulata usando uno di questi due, e il metodo mocked NON viene chiamato, la chiamata .verify() non asserirà.

Esempio che NON asserisce quando il metodo non viene chiamato;

FooClass myFooClass = EasyMock.createNiceMock(FooClass.class); 
EasyMock.expect(myFooClass.someMethod(EasyMock.anyInt()).andStubReturn(true); 
EasyMock.replay(myFooClass); 

EasyMock.verify(myFooClass); 

Esempio che VOLONTÀ asserzione quando il metodo deriso non viene chiamato;

FooClass myFooClass = EasyMock.createNiceMock(FooClass.class); 
EasyMock.expect(myFooClass.someMethod(EasyMock.anyInt()).andReturn(true).atLeastOnce(); 
EasyMock.replay(myFooClass); 

EasyMock.verify(myFooClass); 
Problemi correlati