2012-12-17 4 views
17

sto usando EasyMock di fare alcuni test di unità e non capisco l'uso del EasyMock.expectLastCall(). Come puoi vedere nel mio codice qui sotto, ho un oggetto con un metodo che restituisce void che viene chiamato nel metodo di un altro oggetto. Penso che dovrei fare in modo che EasyMock si aspetti la chiamata al metodo, ma ho provato a commentare l'invocazione expectLastCall() e funziona ancora. È perché ho passato EasyMock.anyObject()) che lo ha registrato come una chiamata prevista o c'è qualcos'altro?aspettative EasyMock con metodi vuoti

MyObject obj = EasyMock.createMock(MyObject.class); 
MySomething something = EasyMock.createMock(MySomething.class); 
EasyMock.expect(obj.methodThatReturnsSomething()).andReturn(something); 

obj.methodThatReturnsVoid(EasyMock.<String>anyObject()); 

// whether I comment this out or not, it works 
EasyMock.expectLastCall(); 

EasyMock.replay(obj); 

// This method calls the obj.methodThatReturnsVoid() 
someOtherObject.method(obj); 

la documentazione delle API per EasyMock dice questo circa expectLastCall():

Returns the expectation setter for the last expected invocation in the current thread. This method is used for expected invocations on void methods. 
+0

Questa domanda non era quello che stavo cercando, ma in combinazione con la risposta e commenti da Yogendra mi ha aiutato a capire il mio problema. Grazie per essere arrivato prima. – DaShaun

risposta

23

Questo metodo restituisce l'handle di attesa attraverso IExpectationSetters; che ti dà la possibilità di convalidare (asserire) che il tuo metodo di annullamento è stato chiamato o meno e comportamenti correlati, ad es.

EasyMock.expectLastCall().once(); 
EasyMock.expectLastCall().atLeastOnce(); 
EasyMock.expectLastCall().anyTimes(); 

API dettagliato delle IExpectationSetters è here.

Nel tuo esempio stai ricevendo l'handle e non stai facendo nulla con esso quindi non vedi alcun impatto di avere o rimuovere la dichiarazione. È proprio come si chiama un metodo getter o si dichiara una variabile e non la si usa.

+0

Che cosa devo fare (o quello che sto facendo) che sta facendo la mia prova si aspettano l'invocazione di 'methodThatReturnsVoid()'? Basta chiamarlo prima del 'replay()'? –

+0

@SotiriosDelimanolis Come ho già detto, usare 'EasyMock.expectLastCall() atLeastOnce();.' Di affermare che il metodo è stato chiamato con successo almeno una volta. –

+0

Lo capisco. Ma se non ho 'expectLastCall()', il test passa ancora. Non dovrebbe fallire visto che non hai fatto in modo che l'oggetto finto lo aspettasse? –

2

Hai solo bisogno EasyMock.expectLastCall(); quando è necessario verificare ulteriormente qualcosa di diverso "Che il metodo è stato chiamato. (Lo stesso di impostazione aspettativa)"

dire che si desidera verificare quante volte il metodo è stato chiamato in modo da aggiungere qualsiasi di:

EasyMock.expectLastCall().once(); 
EasyMock.expectLastCall().atLeastOnce(); 
EasyMock.expectLastCall().anyTimes(); 

o dire che si desidera generare un'eccezione

EasyMock.expectLastCall().andThrow() 

Se non vi interessa allora EasyMock.expectLastCall(); è non richiesto e non fa alcuna differenza, la tua dichiarazione "obj.methodThatReturnsVoid(EasyMock.<String>anyObject());" è sufficiente per impostare le aspettative.

0

Ti manca EasyMock.verify (..)

MyObject obj = EasyMock.createMock(MyObject.class); 
MySomething something = EasyMock.createMock(MySomething.class); 
EasyMock.expect(obj.methodThatReturnsSomething()).andReturn(something); 

obj.methodThatReturnsVoid(EasyMock.<String>anyObject()); 

// whether I comment this out or not, it works 
EasyMock.expectLastCall(); 

EasyMock.replay(obj); 

// This method calls the obj.methodThatReturnsVoid() 
someOtherObject.method(obj); 

// verify that your method was called 
EasyMock.verify(obj); 
+0

No, il 'verify' era implicito.Il problema è spiegato in [risposta di Yogendra] (http://stackoverflow.com/a/13917432/438154). Non ho scritto le mie finte aspettative correttamente. –