[英]How to unit test getClassLoader() returning null
根据类的javadoc
返回该类的类加载器。 一些实现可能使用null来表示引导类加载器。
当getClassLoader返回null时,我们必须对逻辑进行单元测试。 我们正在使用Java(Java 6)的sun实现。 我们应该怎么做。
我的第一个想法只是模拟Class对象,但是在另一个问题中提到: 使用Mockito和PowerMockito模拟类对象
你不能。 Mockito,Easymock(和Powermock)之类的模拟对象库无法模拟由引导类加载器加载的类,因为在加载模拟对象库时它们已经被加载了。 因此它无法操纵字节码。
因此,一个简单的解决方法是查看是否可以使用由引导程序类加载器加载的类,例如java.lang
, java.net
, java.io
类。
例如String.class.getClassloader()
将返回null
。
如果您不能轻松地使用自举类进行测试,那么我将不必为该分支担心太多,因为它将无法在生产中执行。
将目标类放入其自己的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) {
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.