java - method - simulacro de llamadas de método anidadas usando mockito
mockito verify (3)
De los comentarios:
Agregar RETURNS_DEEP_STUBS hizo el truco:
A a = Mockito.mock(A.class, Mockito.RETURNS_DEEP_STUBS);
Tengo 4 clases, digamos A, B, C, D, cada una de las cuales llama a métodos de otra.
Ahora me he burlado de la clase A, y quiero burlarme de un método usando mockito.
A a = Mockito.mock(A.class);
y quiere obtener "foo" en llamadas de método recursivo como
a.getB().getC().getD()
debería devolver "foo"
Lo intenté
when (a.getB (). getC (). getD ()). thenReturn ("foo");
pero tiene nullPointerException
entonces lo intenté
doReturn ("foo"). when (a.getB (). getC (). getD ());
luego tengo org.mockito.exceptions.misusing.UnfinishedStubbingException:
Sé que puedo crear objetos de B, C y D, o incluso puedo escribir algo como
B b = simulacro (B.class) o A.setB (nuevo B ())
y así.
¿Pero no puedo hacer eso de una sola vez? Cualquier ayuda sería apreciada.
Intente creando simulacros de cada uno de los objetos anidados y luego imite el método individual llamado por cada uno de estos objetos.
Si el código objetivo es como:
public Class MyTargetClass {
public String getMyState(MyClass abc){
return abc.getCountry().getState();
}
}
Luego, para probar esta línea, podemos crear simulacros de cada uno de los objetos anidados individuales como a continuación:
public Class MyTestCase{
@Mock
private MyTargetClass myTargetClassMock;
@Mock
private MyClass myclassMockObj;
@Mock
private Country countryMockObj;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
@Test
public void test01(){
when(myclassMockObj.getCountry()).thenReturn(countryMockObj);
when(countryMockObj.getState()).thenReturn("MY_TEST_STATE");
Assert.assertEquals("MY_TEST_STATE", myTargetClassMock.getMyState(myclassMockObj));
}
}
La respuesta técnica de Abhijeet es técnicamente correcta, pero es importante comprender que no debes hacer esto.
Su código de "producción" está violando fuertemente la Ley de Demeter : su clase A no debe saber que tiene que obtener una B para obtener una C para obtener una D.
Eso simplemente conduce a un acoplamiento muy apretado entre todas estas clases. No es Buena idea.
En ese sentido: debe ver que el hecho de que necesita hacer cosas especiales aquí para que su prueba funcione es en realidad una indicación de que su código de producción hace algo que está fuera de lo normal .
Entonces, en lugar de "arreglar" la configuración de su prueba, considere abordar el problema real . Y ese es el diseño de su código de producción !
Y para el registro: getB (). GetC (). GetD () no es una llamada "recursiva"; es más bien un encadenamiento "fluido" de llamadas a métodos. Y como decía: eso no es algo bueno.