web-dev-qa-db-ja.com

PowerMockitoを使用したモックプライベートメソッド

PowerMockitoを使用してプライベートメソッド呼び出し(privateApi)をモックしますが、それでもprivateApi呼び出しが行われ、さらに別のthirdPartCallが行われます。 thirdPartyCallが例外をスローすると、問題が発生します。私が理解している限りでは、privateApiをモックしている場合、メソッド実装の詳細に入り込んでモック応答を返すべきではありません。

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
    }
}

テストケースは次のとおりです。

@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();
    }
}

コンソールトレース:

In privateAPI
In thirdPartyCall
In publicApi
result : 20
9
Pankaj

doReturnを使用するには、モックメソッド呼び出しを変更するだけです。

プライベートメソッドの部分的なモックの例

テストコード

@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();
    }
}

コンソールトレース

In publicApi
result : 20
19
clD