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

2 minutos de lectura

avatar de usuario
usuario389955

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 llama un método de otro objeto?

Esto es lo que quiero hacer: defino un entorno simulado y devuelvo una respuesta sin importar lo que suceda. 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(...);
}

avatar de usuario
K Erlandsson

Puedes usar un Mockito Espiar para esto. Si configuras anotherObj como espía, puede verificar las llamadas a métodos en ese objeto. En su ejemplo, debe asegurarse de que la llamada a foo utiliza el espía en lugar de una implementación ordinaria de anotherObj. El espía está configurando algo como esto:

AnotherClass anotherObjSpy = Mockito.spy(new AnotherClass());
// do stuff -- e.g. anotherObjSpy.foo(...);
verify(anotherObjSpy).codePath1(...);

  • ¿Eso significa que es posible que deba crear e inyectar varios objetos simulados si quiero verificar varias cosas? eso no es conveniente

    – usuario389955

    26 de junio de 2015 a las 6:21

  • @user389955 sí, debe configurar cada objeto que desee 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

    26 de junio de 2015 a las 6:31

  • En lugar de decir “//hacer cosas”, podría ser útil agregar que es “anotherObjSpy” el que debe realizar la llamada al método que se está probando.

    – jwehrle

    4 mayo 2017 a las 22:48

  • Gracias @jwehrle, debe usar anotherObjSpy en las llamadas; de lo contrario, las pruebas no funcionarán.

    – argoth

    11 de diciembre de 2018 a las 9:40

  • Tengo un método final al que no puedo llamar espía

    – Akshay Hazari

    29 de marzo de 2021 a las 9:08

Anote el objeto no simulado con @Spy anotación y luego verifique verify(). Controlar este

¿Ha sido útil esta solución?