在public方法中往往会调用一些private方法,如果private方法很复杂,我们就需要处理很多方法的mock。如果这时只想要测试public方法,并不想关注private方法的逻辑,那么就需要对private方法进行mock。下面我们简单介绍下如何通过Powermock来对私有方法进行mock。
被测试类:
public class MockPrivateClass {
public String mockPrivateFunc() {
return privateFunc();
}
private String privateFunc() {
return "private func";
}
}
此类中包含一个public方法mockPrivateFunc,里面调用了private方法privateFunc。当前我们想要测试该public方法,并且不想进入private方法执行,那么就需要对该私有方法进行模拟。
测试类:
@RunWith(PowerMockRunner.class)
@PrepareForTest({MockPrivateClass.class})
public class MockPrivateClassTest {
private MockPrivateClass mockPrivateClass;
@Test
public void testMockPrivateFunc() throws Exception {
mockPrivateClass = PowerMockito.spy(new MockPrivateClass());
PowerMockito.when(mockPrivateClass, "privateFunc").thenReturn("test");
String realResult = mockPrivateClass.mockPrivateFunc();
Assert.assertEquals("test", realResult);
PowerMockito.verifyPrivate(mockPrivateClass, Mockito.times(1)).invoke("privateFunc");
}
}
1、由于是对本类的私有方法进行模拟,所以需要在PrepareForTest后面加上MockPrivateClass,同时需要使用spy来模拟一个对象。
2、 使用下面方式来模拟私有方法:
PowerMockito.when(mockPrivateClass, "privateFunc").thenReturn("test");
如果私有方法存在参数,则同样的需要在私有方法名后面带上同样个数及类型的参数,其方法原型为:
public static <T> OngoingStubbing<T> when(Object instance, String methodName, Object... arguments) throws Exception;
3、使用verifyPrivate来验证私有方法被调用,其例如下:
PowerMockito.verifyPrivate(mockPrivateClass, Mockito.times(1)).invoke("privateFunc");
verifyPrivate的参数为mock的对象,及验证模式(可选),invoke参数为要验证的私有方法名称及相应参数。