Toto toto = Mockito.spy(new Toto());
Bear in mind that this spies/stubs on the Toto instance you create in this line, and not every newly-created Toto. So when you call:
Titi testedObject = new Titi();
testedObject.executeTiti();
The constructor new Titi()
itself creates a new instance of Toto, unaffected by Mockito, so that call to this.toto.executeAction()
will always return 5.
Because you're running with PowerMockito, you do have the option of stubbing Toto's constructor:
@RunWith(PowerMockRunner.class)
@PrepareForTest(Titi.class) // stub the calling class Titi, not Toto!
public class TitiTest {
@Test public void testExecuteTiti() {
Toto toto = Mockito.spy(new Toto());
Mockito.doReturn(2).when(toto).executeToto(Mockito.any(Tutu.class));
PowerMockito.whenNew(Toto.class).withAnyArguments().thenReturn(toto);
Titi testedObject = new Titi();
testedObject.executeTiti();
}
}
But the option I like the best is to create a secondary constructor for Titi, for testing:
public Titi(){
this.toto = new Toto();
}
/** For testing only. Uses the passed Toto instance instead of a new one. */
Titi(Toto toto){
this.toto = toto;
}
Which then only requires you to adjust your test like this:
@Test public void testExecuteTiti(){
Toto toto = Mockito.spy(new Toto());
Mockito.doReturn(2).when(toto).executeToto(Mockito.any(Tutu.class));
Titi testedObject = new Titi(toto);
testedObject.executeTiti();
}