web-dev-qa-db-fra.com

Mock méthode privée à l'aide de PowerMockito

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
9
Pankaj

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
19
clD