如何单元测试getClassLoader()返回null

时间:2014-12-08 05:49:20

标签: java unit-testing junit classloader junit4

根据Class

的javadoc
  

返回类的类加载器。某些实现可能使用null来表示引导类加载器。

当getClassLoader返回null时,我们必须对逻辑进行单元测试。我们正在使用Java的Java实现(Java 6)。我们怎么能这样做。

2 个答案:

答案 0 :(得分:1)

我的第一个想法是,只是嘲笑Class对象,但在另一个问题中提到:Mocking a class object using Mockito and PowerMockito

你不能。像Mockito,Easymock(和Powermock)这样的模拟对象库不能模拟由引导类加载器加载的类,因为它们已经在模拟对象库加载时加载。因此它无法操纵字节码。

因此,一个简单的解决方法是查看是否可以使用由引导类加载器加载的类,例如java.langjava.netjava.io中的类。

例如String.class.getClassloader()将返回null

如果你不能轻易地使用一个自举课程进行测试,那么我不会太担心那个分支,因为它无法在生产中执行。

答案 1 :(得分:0)

将目标类放入其自己的JAR中,然后使用-Xbootclasspath/a:testclass.jar启动测试JVM。这将导致该JAR中的所有类都由引导类加载器加载。如果类需要其他依赖项,这将更加棘手。

或者,我过去的方法是重构代码,为测试目的添加一个特殊的入口点:

public void someMethod(Class c) {
    someMethodImpl(c, c.getClassLoader());
}

// Exposed for test only.
void someMethodImpl(Class c, ClassLoader cl) {
    ...
}