(一)PowerMockito进行UT测试如何略过方法,使方法不被执行(含私有方法):
PowerMockito.doNothing().when(TestMock.class,"foo1");//仅适用于方法返回值为void类型
PowerMockito.suppress(PowerMockito.methods(TestMock.class, "foo1"));//适用于任何方法
(二)调用私有方法的两种方式:1.JDK反射 2.PowerMockito自带method接口
//样例1:JDK反射
Method method = TestMock.class.getDeclaredMethod("testPrivate1");
method.setAccessible(true);
String invoke = (String) method.invoke(TestMock.class, "hello world");
System.out.println(invoke)
如果testPrivate1是静态私有方法,可以用上述调用方法,
如果是非静态私有方法,String invoke = (String) method.invoke(TestMock.class, "hello world");这里的class应该改为对象
//******PowerMockito method接口*******
//样例2:基本类型参数
Method method = PowerMockito.method(TestMock.class,"testPrivate2", String.class);
String invoke = (String) method.invoke(TestMock.class, "hello world");
System.out.println(invoke);
List<String> dataList = new ArrayList<String>();
dataList.add("1");
dataList.add("2");
dataList.add("3");
//样例3:常见应用类型参数
Method method = PowerMockito.method(TestMock.class,"testPrivate3", List.class);
String invoke = (String) method.invoke(TestMock.class, dataList);
System.out.println(invoke);
//样例4:不带泛型
Method method = PowerMockito.method(TestMock.class,"testPrivate4", ArrayList.class);
String invoke = (String) method.invoke(TestMock.class, dataList);
System.out.println(invoke);
//样例5:带泛型(常见错误用法:ArrayList<String>.class)
Method method = PowerMockito.method(TestMock.class,"testPrivate4", new ArrayList<String>().getClass());
String invoke = (String) method.invoke(TestMock.class, dataList);
System.out.println(invoke);
//样例6:数组参数
Method method = PowerMockito.method(TestMock.class, "testPrivate5", String[].class);
String invoke = (String) method.invoke(TestMock.class, new Object[]{new String[]{"1","2","3"}});//注意invoke方法入参,此处必须为new Object[]{},否则会出现参数异常
System.out.println(invoke);
(三)Whitebox.setInternalState接口用法
该方法可以向被测试类注入引用类型,不管被修改的成员变量是否是final类型。如下:向DataFileHandler类的private static final logger成员变量注入fakeLogger对象。
FakeLogger fakeLogger = new FakeLogger(DataFileHandler.class.getName());
Whitebox.setInternalState(DataFileHandler.class, "logger", fakeLogger);
注意:该接口无法向被测类的基本类型的final成员变量注入,如:private static final String,但可以向非final的成员变量注入,如:private stat