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