单元测试--Junit测试私有方法

 

一般情况下私有方法只能在所属类的内部进行调用,在类外则无法通过对象.方法名的方法调用私有方法。在Junit中对私有方法进行测试有两种方法:

方法一:使用PowerMock测试私有方法:

Object result = Deencapsulation.invoke(mockClass, methodName, parameter1, parameter2....)

 

其中:

1.mockClass:该参数是需要被调用方法所属的类,该类需要被mock

2.methodName:该参数是需要被调用的私有方法的名称

3.parameter:该参数为调用方法的参数的值

4.Deencapsulation.invoke():返回结果类型,与调用方法(即测试方法)的返回类型一致

 

 

方法二:通过反射机制测试私有方法:

Method method = 类对象.getclass().getDeclaredMethod(methodName, 参数类型1,  参数类型2....)

Object result = method.invoke(类对象, 参数值1, 参数值2....)

 

其中:

1类对象:调用私有方法所属类的对象

2.methodName:调用的私有方法名

3.method.setAccessible(true)指定私有方法可测试权限

 

常用反射法测试:

eg1:

@Test
public void add2()
{
Calculator c=new Calculator();
Class<Calculator> cal=Calculator.class;

try {
Method method=cal.getDeclaredMethod("add2", new Class[]{int.class,int.class});
method.setAccessible(true);
Object obj=method.invoke(c, new Object[]{1,2});

Assert.assertEquals(3, obj);
} catch (Exception e) {
Assert.fail("-----");
}
}

 

eg2:

/**
* 测试私有权限方法前,修改方法权限
*
* @param target 目标对象
* @param functionName 字段的名称
* @param parameters 值
*/
public static Object setAccess4PrivateFunction(Object target, String functionName, Object[] parameters) throws
NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Class<?> clazz = target.getClass();
if (parameters == null || parameters.length == 0) {
Method method = clazz.getDeclaredMethod(functionName);
method.setAccessible(true);
return method.invoke(target);
}
int count = parameters.length;
Class<?>[] paraClass = new Class[count];
int index = 0;
for (Object para : parameters) {
Class<?> tmpClass = para.getClass();
if (tmpClass.equals(LinkedHashMap.class) || tmpClass.equals(HashMap.class)) {
paraClass[index] = Map.class;
} else {
paraClass[index] = tmpClass;
}
index++;
}
Method method = clazz.getDeclaredMethod(functionName, paraClass);
method.setAccessible(true);
return method.invoke(target, parameters);
}

 

posted @   都是好事  阅读(6006)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示