使用PowerMockito模拟私有方法

我正在使用PowerMockito来模拟私有方法调用(privateApi),但它仍然使privateApi调用进而产生另一个thirdPartCall。 当thirdPartyCall抛出exception时,我遇到了问题。 据我所知,如果我在模拟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 

您只需要更改模拟方法调用以使用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