单元测试--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 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);
}