我必须从一些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
,在该类中创建一个新的类加载器,并使其加载所有引用的类.在创建类加载器之后,它将K
从JAR文件加载该类.
这意味着每次用户提交他的JAR时,Evaluation
都会实例化一个单独的,它会创建自己的类加载器并启动JUnit测试.当发生这种情况时,测试将使用用户的实现K
,而不是默认的实现.
这可能吗,怎么办呢?
我读到类加载器总是问他们的父是否已经加载了一个类.这意味着我必须以某种方式"刷新"我从JAR文件中动态加载的所有类Evaluation
,以便它们将被卸载然后再次加载到另一个中Evaluation
.
加载类K
,测试类K
,卸载类K
,重复不同K
.