如何使用Junit5进行每个测试的单独的类加载器

时间:2019-11-08 06:29:30

标签: java junit5

我一直在尝试设置Junit 5扩展,以强制每个测试都获得单独的ClassLoader。我可以在Junit4中非常轻松地创建自己的BlockJUnit4ClassRunner。但是,我现在无法正常工作。

目的是能够测试处于不同状态的事物,例如静态块或存储的字段。

到目前为止,我一直在尝试使用TestInstanceFactory进行类似的操作,但没有成功:

public class SeparateClassLoaderExtension implements TestInstanceFactory {

    @SneakyThrows
    @Override
    public Object createTestInstance(TestInstanceFactoryContext factoryContext, ExtensionContext extensionContext) throws TestInstantiationException {
        ClassLoader testClassLoader = new TestClassLoader();
        final Class<?> testClass = Class.forName(factoryContext.getTestClass().getName(), true, testClassLoader);

        Constructor<?> defaultConstructor = testClass.getDeclaredConstructor();
        defaultConstructor.setAccessible(true);
        return defaultConstructor.newInstance();
    }
}

我从Junit那里得到一个例外,说该类的类型不正确。

有人知道吗?

2 个答案:

答案 0 :(得分:3)

JUnit Jupiter尚支持此功能。这是相关的问题:https://github.com/junit-team/junit5/issues/201

答案 1 :(得分:0)

他们做了像Spring there那样令人费解的事情。

看起来或多或少都在工作,但是它无法与其他扩展注入参数一起使用,因此我没有走得更远。