在进行单元测试时,我们往往需要直接访问某个类的内部类或者某个类的私有方法,此时正常的调用就无能为力了,因此我们可以使用反射进行调用。
使用反射调用类的私有方法
实现方法 获取类的Class对象
Class class = Class.forName("类名") 或 Class class = 类实例.getClass()
new一个实例
Object object = class.newInstance();
获取私有方法
Method method = class.getDeclaredMethod("方法名",参数类型1.class,参数类型2.class,...);
设置方法可访问
method.setAccessible(true);
调用私有方法
method.invoke(类实例,参数1,参数2,...);
@Resource
Pending pending;
@Test
public void test() throws InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
String S = "{\n" +
" \"billCode\": \"1102541214694\",\n" +
" \"complainId\": \"1787669881060413440\",\n" +
" \"actionType\": \"pending\",\n" +
" \"features\": \"{\\\"packageStatus\\\":7,\\\"damageLevel\\\":2}\",\n" +
" \"param\": \"{\\\"remark\\\":\\\"很抱歉,快递公司反馈包裹已确认全部破损,您可直接申请退款或联系商家补发\\\",\\\"complainSource\\\":\\\"zjtd\\\"}\",\n" +
" \"jsonData\": \"{\\\"changeInfo\\\":2}\",\n" +
" \"problemLocation\": \"\",\n" +
" \"reasonAnalysis\": \"\"\n" +
"}";
ComplainAction A = JSON.parseObject(S,ComplainAction.class);
Class C = pending.getClass();
Method method = C.getDeclaredMethod("feedbackComplain",ComplainAction.class);
method.setAccessible(true);
method.invoke(pending,A);
}