【问题标题】:How to unit test getClassLoader() returning null如何对返回 null 的 getClassLoader() 进行单元测试
【发布时间】:2014-12-08 05:49:19
【问题描述】:

根据Class的javadoc

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

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

【问题讨论】:

  • 感谢您的输入,我选择不测试“null”分支。谢谢 bkail 和 dkatzel。

标签: java unit-testing junit classloader junit4


【解决方案1】:

我的第一个想法是模拟 Class 对象,但正如另一个问题中提到的那样:Mocking a class object using Mockito and PowerMockito

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

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

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

如果您不能轻松地使用引导类进行测试,那么我不会太担心该分支,因为它无法在生产中执行。

【讨论】:

  • 感谢您的意见,我选择不测试“空”分支
【解决方案2】:

将目标类放入自己的 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) {
    ...
}

【讨论】:

    猜你喜欢
    • 2016-06-29
    • 1970-01-01
    • 2010-10-12
    • 2020-09-28
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 2016-10-18
    相关资源
    最近更新 更多