单元测试时,有时需要对私有方法进行测试。但是,此时会遇到个问题,私有方法仅能被本类中的其他方法引用,对其他类则不可见。
今天记录一下自己学到的一种设置私有方法可用的技巧,反射。另外多说一句,还有一种途径时通过PowerMock的方式设置私有方法可用,这里先不做介绍。
例如,有如下一个类中的私有方法
public class MakePrivateMethodAccessabel {
private String method(String s){
return s;
}
}
接下来对method方法进行测试(我是用IDEA的,一般IDEA中可通过快捷键Ctrl + Shift + T来对某个可UT方法自动创建测试类及设置测试方法的,但是对私有方法时,就会发现不可用,这也是因为私有方法进队该类内部可用的原因)。
测试代码如下:
import org.junit.Assert;
import java.lang.reflect.Method;
public class MakePrivateMethodAccessabelTest {
Method method = null;
@org.junit.Before
public void setUp() throws Exception {
//设置私有方法可见
method = MakePrivateMethodAccessabel.class.getDeclaredMethod("method",String.class);
method.setAccessible(true);
}
@org.junit.Test
public void testMethod() throws Exception {
String s = "s";
MakePrivateMethodAccessabel makePrivateMethodAccessabel = new MakePrivateMethodAccessabel();
String result = (String) method.invoke(makePrivateMethodAccessabel,s);
Assert.assertTrue(result.equals(s));
}
}
设置私有方法可见的途径如上述代码:
(1)声明一个Method(这是java.lang.reflect中的一个类)对象;
(2)我们可以将类中的每个方法当做一个个Method实例来看待。
接下来,我们需要在待测私有方法所在类中获得我们需要的这个私有方法对象,获取方法如下:
MakePrivateMethodAccessabel.class.getDeclaredMethod(“method”,String.class);
调用Class类的getDeclaredMethod方法,入参为方法名及方法本身入参所需的类
(3)设置Method实例后,设置其可见:
method.setAccessible(true);
(4)这样以后,方法就可见了,但是调用还得通过我们声明的那个method实例invoke方式调用,入参则为方法所在类对镜的实例及方法需要的入参:
method.invoke(makePrivateMethodAccessabel,s);