¿Cómo verificar que se llame a un método de un objeto no simulado?

103

Parece que mockito solo verifica si se llama a un método de un objeto simulado y el objeto simulado siempre tiene algo como doReturn().when(mock object)

Pero, ¿puedo crear un objeto simulado y definir doReturn().when(mock object) y luego verificar que se llame a un método de otro objeto?

Esto es lo que quiero hacer: defino un entorno simulado y devuelvo una respuesta pase lo que pase. Pero luego quiero verificar diferentes métodos de otroObj se llama en diferentes casos.

¿Como hacer eso?

public class BaseClass {
    private Environment mockEnvironment;
    @Test
    public void testcase () {
     setMockitoEnvironment(); 
     response = foo(mockEnvironment, argument1);
     verify(anotherObj).codePath1(...);
     response = foo(mockEnvironment, argument2);
     verify(anotherObj).codePath2(...);
   }
}

//this method successfully return a response with any input 
//because I do not care how response is eventually generated, 
//I only care whether code path reaches createResponse() via 
//code path 1 or code path 2.
private void setMockitoEnvironment() {
    mockEnvironment = mock(Environment.class);
    doReturn (response).when(mockEnvironment).createResponse(for any input);
}
private Response foo(...) {
    ... 
    return createResponse(...);
}
user389955
fuente

Respuestas:

121

Puedes usar un Mockito Spy para esto. Si configura anotherObjcomo espía, puede verificar las llamadas a métodos en ese objeto. En su ejemplo, debe asegurarse de que la llamada a fooutilice el espía en lugar de una implementación normal de anotherObj. El espía está configurado de esta manera:

AnotherClass anotherObjSpy = Mockito.spy(new AnotherClass());
// do stuff -- e.g. anotherObjSpy.foo(...);
verify(anotherObjSpy).codePath1(...);
K Erlandsson
fuente
Eso significa que es posible que deba crear e inyectar varios objetos simulados si quiero verificar varias cosas. eso no es conveniente.
user389955
@ user389955 sí, debe configurar cada objeto que desea verificar como espía. Hasta donde yo sé, no hay forma de evitarlo. Mockito necesita agregar un proxy a los objetos y alguien debe decirle a Mockito qué objetos usar como proxy.
K Erlandsson
10
En lugar de decir "// hacer cosas", podría ser útil agregar que es el "otroObjSpy" el que debe realizar la llamada al método que se está probando.
jwehrle
Gracias @jwehrle, necesitas usar anotherObjSpy en las llamadas, de lo contrario las pruebas no funcionarán.
argoth
2

Anote el objeto no simulado con una @Spyanotación y luego verifique verify(). Mira esto

CodeHunter
fuente