2010-01-21 13 views
6

Sto provando a configurare un test in JUnit con EasyMock e sto riscontrando un piccolo problema che non riesco a capire. Speravo che qualcuno qui potesse aiutarti.JUnit Easymock Chiamata al metodo inattesa

Ecco una versione semplificata del metodo che sto cercando di prova:

public void myMethod() { 
    //(...) 
    Obj myObj = this.service.getObj(param); 
    if (myObj.getExtId() != null) { 
     OtherObj otherObj = new OtherObj(); 
     otherObj.setId(myObj.getExtId()); 
     this.dao.insert(otherObj); 
    } 
    //(...) 
} 

Ok in modo da utilizzare EasyMock ho preso in giro la chiamata service.getObj(myObj) e che funziona bene.

Il mio problema arriva quando JUnit raggiunge la chiamata dao.insert(otherObj). EasyMock getta un *Unexpected Method Call* su di esso.

non mi dispiacerebbe beffardo che dao nel mio test e l'utilizzo expectLastCall().once(); su di esso, ma che presuppone che ho una maniglia sul "otherobj" che è passato come parametro in fase di inserimento ... che ovviamente non dal momento che è stato creato condizionatamente nel contesto del metodo testato.

Chiunque ha mai avuto a che fare con questo e in qualche modo risolto?

Grazie.

risposta

9

Se non è possibile ottenere un riferimento all'oggetto stesso nel codice di prova, è possibile utilizzare EasyMock.anyObject() come argomento previsto per il metodo insert. Come suggerisce il nome, ci si aspetta che il metodo venga chiamato con .. beh, qualsiasi oggetto :)

È forse un po 'meno rigoroso rispetto all'argomento esatto, ma se sei soddisfatto, dagli un rotazione. Ricordare di includere il cast a OtherObj quando si dichiara la chiamata al metodo previsto.

+0

Sì, ha fatto il trucco grazie a DoctorRuss. :) – Lancelot

12

È inoltre possibile utilizzare EasyMock.isA(OtherObj.class) per un po 'più di sicurezza del tipo.

5

Il matcher anyObject() funziona alla grande se si vuole solo superare questa chiamata, ma se si desidera effettivamente convalidare l'oggetto costruito è ciò che si pensava che sarebbe stato, è possibile utilizzare una cattura. Sarebbe qualcosa di simile:

Capture<OtherObj> capturedOtherObj = new Capture<OtherObj>(); 
mockDao.insert(capture(capturedOtherObj)); 
replay(mockDao); 

objUnderTest.myMethod(); 

assertThat("captured what you expected", capturedOtherObj.getValue().getId(), 
      equalTo(expectedId)); 

Inoltre, PowerMock ha la capacità di aspettarsi un oggetto da costruire, così si potrebbe guardare in che se si voleva.

1

Si noti inoltre che se si utilizza EasyMock.createStrictMock();, anche l'ordine delle chiamate al metodo è importante e se si interrompe questa regola, si invierà una chiamata di metodo inattesa.

Problemi correlati