J'utilise PowerMockito pour se moquer de l'appel de méthode privée (privateApi), mais il fait toujours l'appel privateApi qui à son tour fait un troisième tiersPartCall. Je rencontre des problèmes lorsque thirdPartyCall lève une exception. Si je comprends bien, si je me moque de privateApi, il ne devrait pas entrer dans les détails d'implémentation de la méthode et renvoyer la réponse fictive.
public class MyClient {
public void publicApi() {
System.out.println("In publicApi");
int result = 0;
try {
result = privateApi("hello", 1);
} catch (Exception e) {
Assert.fail();
}
System.out.println("result : "+result);
if (result == 20) {
throw new RuntimeException("boom");
}
}
private int privateApi(String whatever, int num) throws Exception {
System.out.println("In privateAPI");
thirdPartyCall();
int resp = 10;
return resp;
}
private void thirdPartyCall() throws Exception{
System.out.println("In thirdPartyCall");
//Actual WS call which may be down while running the test cases
}
}
Voici le cas de test:
@RunWith(PowerMockRunner.class)
@PrepareForTest(MyClient.class)
public class MyclientTest {
@Test(expected = RuntimeException.class)
public void testPublicAPI() throws Exception {
MyClient classUnderTest = PowerMockito.spy(new MyClient());
PowerMockito.when(classUnderTest, "privateApi", anyString(), anyInt()).thenReturn(20);
classUnderTest.publicApi();
}
}
Trace de la console:
In privateAPI
In thirdPartyCall
In publicApi
result : 20
Vous avez juste besoin de changer l'appel de la méthode fictive pour utiliser doReturn
.
Exemple de moquerie partielle d'une méthode privée
Code de test
@RunWith(PowerMockRunner.class)
@PrepareForTest(MyClient.class)
public class MyClientTest {
@Test(expected = RuntimeException.class)
public void testPublicAPI() throws Exception {
MyClient classUnderTest = PowerMockito.spy(new MyClient());
// Change to this
PowerMockito.doReturn(20).when(classUnderTest, "privateApi", anyString(), anyInt());
classUnderTest.publicApi();
}
}
Trace de la console
In publicApi
result : 20