2010-09-18 5 views
49

¿Cuál es la diferencia entre usar andReturn(T value) vs andStubReturn(T value) para EasyMock?EasyMock andReturn() vs andStubReturn()

¿En qué situación usaría andStubReturn() donde andReturn() no puede lograr el mismo resultado?

Respuesta

52

Se utiliza un retorno de código auxiliar para una llamada de método en el simulacro que espera que suceda pero que no le interesa. Utiliza una devolución regular para una llamada a un método "normal".

Considere el siguiente método:

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

... donde service es un campo mockable. La cosa hashCode() en las instrucciones de registro es inventada, pero el punto es que su simulacro debe responder a cualquier número de llamadas al getName() para evitar un NPE, mientras que de lo contrario no podría importarle menos.

Al escribir una prueba de unidad basada EasyMock para este método, se había andStubReturn() la llamada a getName() y el uso normal de un andReturn() para la llamada a postMessage(String). Cuando verifique el objeto simulado, solo considerará el último y su prueba no se interrumpirá si cambia la configuración de log4j.

+8

así que déjame ver si entiendo esto correctamente. Básicamente, yStubReturn() se utiliza para los métodos que no nos importan para nuestra prueba de los objetos simulados, pero se nos exige que simulemos el retorno, de lo contrario, el código no funcionará. Los métodos andStubReturn() no son verificados por EasyMock; mientras que los métodos de andReturn() se verifican. – Glide

+1

Eso es correcto. – Barend

+0

Hola, ¿será lo mismo usar andReturn() con expectLastCall(). AnyTimes() adicional? – damluar

5

Una nota adicional para mayor claridad.

Si usa .andStubReturn() (o si usa .andReturn (foo) .anyTimes()), no habrá un número mínimo de llamadas esperadas. Entonces, si establece una expectativa ficticia utilizando cualquiera de estos dos, y NO se llama al método falso, la llamada .verify() no se confirmará.

Ejemplo que NO afirman cuando no se llama al método de imitación;

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

EasyMock.verify(myFooClass); 

Ejemplo que WILL aserción cuando el método burlado no se llama;

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

EasyMock.verify(myFooClass); 
Cuestiones relacionadas