Nuestro equipo especializado despúes de ciertos días de trabajo y recopilación de de información, hallamos la solución, deseamos que te sea útil en tu proyecto.
Solución:
agregando RETURNS_DEEP_STUBS Hizo el truco:
A a = Mockito.mock(A.class, Mockito.RETURNS_DEEP_STUBS);
La respuesta de Abhijeet es técnicamente correcta, pero es importante entender: debe no estar haciendo esto.
Su código de “producción” es fuertemente violando la Ley de Deméter: tu clase A debería no sabe que tiene que obtener una B para obtener una C para obtener una D.
Eso simplemente conduce a súper duro acoplamiento entre todas estas clases. No es Buena idea.
En ese sentido: debe ver el hecho de que necesita hacer cosas especiales aquí para que su prueba funcione como una indicación de que su código de producción hace algo que es fuera de lo normal.
Entonces, en lugar de “arreglar” su configuración de prueba, considere abordar el problema real. Y ese es el diseño de tu Codigo de producción!
Y para que conste: getB().getC().getD() no es una llamada “recursiva”; es más un encadenamiento “fluido” de llamadas a métodos. Y como se dijo: eso es no una cosa buena.
Intente crear una simulación de cada uno de los objetos anidados y luego simule 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 se muestra 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));
Puntuaciones y comentarios
Si entiendes que te ha resultado provechoso nuestro artículo, sería de mucha ayuda si lo compartes con otros juniors y nos ayudes a dar difusión a nuestra información.