¿Es posible realizar espionaje anidado con Mockito?
Supongamos que tengo un objeto como este:
public ClassA() {
public void start() {
...
ClassB algo = getSomeStuff();
...
}
protected ClassB getSomeStuff() {
return new ClassB(render, response);
}
}
Luego estoy intentando hacer algunas pruebas unitarias de esta manera, donde espío una llamada al método en un objeto espía:
@Spy private ClassA classA;
@Mock private ClassC classC;
...
@Test
void test1() {
ClassB classB = spy(classA.getSomeStuff());
doReturn(classC).when(classB).getResults();
classA.start();
}
Cuando ejecuto esta prueba y llego a esta última línea, puedo ver en mi depurador que no está devolviendo classC.
¿Es esto porque no es posible hacer espionaje anidado? ¿O hay algo mal en mi configuración? ¿O debería abordar esto de manera diferente?
Detalles:
– junit: 5.7.0
– mockito: 3.12.4
davy.ai
Posibles problemas con espionaje anidado y cómo abordar esta situación usando Mockito:
Enfoque alternativo: Un enfoque alternativo podría ser refactorizar el código en
ClassA
para que la creación deClassB
se extraiga en un método separado que se pueda mockear o espiar fácilmente. Por ejemplo:Luego, en la prueba, puede espiar
ClassA
y hacer mock al métodocreateClassB
para devolver una instancia espía deClassB
con el comportamiento deseado:Este enfoque le permite controlar el comportamiento de
ClassB
sin tener que anidar objetos espías y evita cualquier posible problema que pueda surgir de esto.