单元测试--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);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?