单元测试PowerMockito使用说明
1、Mock私有属性
下面是给caltFeeInfo对象的validator属性赋值“属性值”,示例如下:
CaltFeeInfo caltFeeInfo = new CaltFeeInfo();
PowerMockito.field(CaltFeeInfo.class, "validator").set(caltFeeInfo, "属性值");
2、Mock私有方法
示例:
* 不带参数
CaltFeeInfo caltFeeInfo1 = PowerMockito.spy(new CaltFeeInfo());
PowerMockito.doReturn(“C1”).when(caltFeeInfo1, "getHeader");
* 带一个参数
CaltFeeInfo caltFeeInfo1 = PowerMockito.spy(new CaltFeeInfo());
PowerMockito.doReturn(“C1”).when(caltFeeInfo1, "getCaltFeeInfo",Mockito.anyString());
说明:
先spy一个真实对象caltFeeInfo1,然后mock私有方法getCaltFeeInfo返回C1。
注意事项:
1.使用下面这种方式mock私有方法,经过测试是不生效的,依然会执行方法内部程序。
PowerMockito.when(caltFeeInfo1, "getContactId").thenReturn("C1");
2.带有参数的私有方法,如果实际执行这个私有方法传递的参数与mock时设置的参数不一致,那么mock私有方法依然不生效,会执行内部程序。
3、 Mock静态方法
示例:
PowerMockito.mockStatic(HttpPostRequestUtil.class);
PowerMockito.when(HttpPostRequestUtil.getContactId(Mockito.anyString())).thenReturn("C1");
说明:
将HttpPostRequestUtil类的getContactId方法进行mock,无论传递的是什么String参数都将返回“C1”
4、Mock构造方法
示例:
* 被测代码:
public class CaltFeeInfo {
public boolean callInternalInstance(String path) {
File file = new File(path);
return file.exists();
}
}
测试代码:
File file = PowerMockito.mock(File.class);
CaltFeeInfo caltFeeInfo1 = new CaltFeeInfo();
PowerMockito.whenNew(File.class).withArguments("bbb").thenReturn(file);
PowerMockito.when(file.exists()).thenReturn(true);
assertTrue(caltFeeInfo1 .callInternalInstance("bbb"));
注意事项:
当无参的构造方法与可变参构造方法同时存在时,不能使用withNoArguments()(报错的内容大概的意思就是不知道映射到哪个),应该使用withAnyArguments()
原始方法示例:
Public CaltFeeInfo (){
}
Public CaltFeeInfo (int ... args){
}
5、 Mock普通方法 + Mock final方法
示例:
CaltFeeInfo caltFeeInfo1 = PowerMockito.mock(CaltFeeInfo .class);
PowerMockito.when(caltFeeInfo1.isAlive()).thenReturn(true);
6、 Mock void方法
示例:
CaltFeeInfo caltFeeInfo1 = PowerMockito.mock(CaltFeeInfo .class);
PowerMockito.doNothing().when(caltFeeInfo1.isAlive());