Nic*_*ckJ 2 java reflection junit
我正在尝试编写一个实用工具方法,以便在被测试的类中轻松调用私有方法.我有的是这个:
private Object callPrivateMethod(String methodName, Object subject, Object... parameters) {
    try {
        Class<?>[] paramTypes = new Class<?>[parameters.length];
        for (int index=0; index<parameters.length; index++) {
            paramTypes[index] = parameters[index].getClass();
        }
        Method method = subject.getClass().getDeclaredMethod(methodName, paramTypes);
        method.setAccessible(true);
        return method.invoke(subject, parameters);
    } catch (Exception e) {
        e.printStackTrace();
        fail(e.getMessage());
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用此代码调用它时:
List<Session> sessions = new ArrayList<Session>();
// fill the array list
String sessionLines = (String) callPrivateMethod("getSessionsForEmail", emailSender, sessions);
Run Code Online (Sandbox Code Playgroud)
我得到这个例外:
java.lang.NoSuchMethodException: staffing.server.email.EmailSender.getSessionsForEmail(java.util.ArrayList)
Run Code Online (Sandbox Code Playgroud)
EmailSender(测试中的类)中的方法签名如下所示:
private String getSessionsForEmail(List<Session> sessions) {
   //do stuff
}
Run Code Online (Sandbox Code Playgroud)
试图弄清楚为什么反射找不到方法.与List和ArrayList不完全相同的类是什么?如果是这样,我该怎么办?
最好不要直接测试私有方法.通过公共和/或受保护的方法访问它们,我们正在测试系统在生产中的表现.此方法还允许您通过公共/受保护方法发送所有数据组合来管理测试覆盖率.
可以通过在测试源文件夹中具有相同的包名来测试受保护的方法.
如果测试私有方法是必须的,那么你可能会使用诸如Powermock之类的模拟工具,最好是使用Mockito,而不是自己进行反射.这两个工具都与JUnit有很好的集成.这是一个陡峭的学习曲线,但值得投资.这里有更多细节:使用mockito测试私有方法
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           2454 次  |  
        
|   最近记录:  |