【发布时间】:2014-01-12 16:33:11
【问题描述】:
我必须多次从某个 JAR 中动态加载同名但实现不同的类。
我正在创建一个评估器后端,我必须动态加载类并测试它们。
测试是实例化应该测试的类的JUnit类,这是一个简单的例子:
package evaluator.tests;
import static org.junit.Assert.*;
import org.junit.*;
import evaluator.tested.*;
public class KTest {
private K tested;
@Before
public void setup() {
tested = new K();
}
@Test
public void returnsTrueTest() {
assertTrue(tested.returnsTrue());
}
}
我的应用程序的其余部分需要从用户那里接收 JAR 文件,这些文件将包含上面正在测试的 K 类的实现。然后,KTest 必须在 他们的 K 类上运行,而不是在应用程序中运行。
我知道如何动态加载一个类,但我不知道如何使用它进行测试,而不是我所做的那个。
我想出的解决方案之一是将测试隔离在一个全新的类中,例如Evaluation,在该类中创建一个新的类加载器,并使其加载所有引用的类。创建类加载器后,它会从 JAR 文件中加载 K 类。
这意味着每次用户提交他的 JAR 时,都会实例化一个单独的 Evaluation,它会创建自己的类加载器并启动 JUnit 测试。发生这种情况时,测试将使用用户的K 实现,而不是默认实现。
这可能吗?如何做到?
我读到类加载器总是询问他们的父类是否已经加载。这意味着我必须以某种方式“刷新”我从 Evaluation 中的 JAR 文件动态加载的所有类,以便将它们卸载然后在另一个 Evaluation 中再次加载。
加载类K,测试类K,卸载类K,用不同的K重复。
【问题讨论】:
标签: java class junit classloader