2010-01-21 24 views
6

estoy tratando de configurar una prueba de JUnit w/EasyMock y yo estoy corriendo en un pequeño problema que me parece que no puede envolver mi cabeza alrededor. Esperaba que alguien aquí pudiera ayudar.JUnit EasyMock llamada al método inesperado

Aquí es una versión simplificada del método que estoy tratando de prueba:

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 por lo que el uso de EasyMock he burlado la llamada service.getObj(myObj) y que funciona bien.

Mi problema viene cuando golpea el JUnit) llamada dao.insert(otherObj. EasyMock arroja un *Unexpected Method Call* en él.

no me importaría que burlarse de DAO en mi prueba y el uso de expectLastCall().once(); en él, pero que se supone que tengo una manija en el "otherObj" que se pasa como parámetro a la hora de inserción ... que por supuesto no, ya que se crea condicionalmente dentro del contexto del método que se prueba.

Cualquier persona ha tenido que lidiar con eso y de alguna manera resuelto?

Gracias.

Respuesta

9

Si no puede obtener una referencia al objeto en su código de prueba, puede usar EasyMock.anyObject() como el argumento esperado para su método insert. Como su nombre indica, esperará que se llame al método con ... bueno, cualquier objeto :)

Es quizás un poco menos riguroso que el argumento exacto, pero si está satisfecho con él, dele una girar. Recuerde incluir el molde en OtherObj al declarar la llamada al método esperado.

+0

Sí que lo hizo el truco gracias DoctorRuss. :) – Lancelot

12

También es posible usar EasyMock.isA(OtherObj.class) un poco más de seguridad de tipos.

5

El matcher anyObject() funciona muy bien si solo quiere pasar esta llamada, pero si realmente quiere validar el objeto construido es lo que pensaba que iba a ser, puede utilizar una captura. Se vería algo como:

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

objUnderTest.myMethod(); 

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

Además, PowerMock tiene la capacidad de esperar que un objeto para ser construido, por lo que podría mirar en que si se quería.

1

Tenga en cuenta también que si utiliza EasyMock.createStrictMock();, el orden de las llamadas al método también es importante y si rompe esta regla, lanzará una llamada a un método inesperado.

Cuestiones relacionadas