使用工厂方法在 Junit 5 中创建测试实例(无动态测试)

Create test instance in Junit 5 with factory method (no dynamic test)

使用 JUnit 4,可以使用运行器控制测试实例生命周期。例如,我曾经实现 BlockJUnit4ClassRunner 的方法 createTest() 以创建经过微调的实例(在我的例子中,使用 Weld 检索 CDI 就绪实例)。

在 JUnit 5 中,extensions 应该取代跑步者和规则。然而,我找不到一种方法来像使用 JUnit 4 那样连接到测试实例创建中。

有没有办法告诉 JUnit Jupiter 如何在不使用动态测试的情况下创建我的测试实例(例如,使用 Weld 容器)?

这是我现在在 JUnit 4 中所做的,并且希望能够在 Jupiter 中做到:

public class ContainerRunner extends BlockJUnit4ClassRunner {

    private WeldContainer container;

    ...

    @Override
    public Object createTest() {
        return container.select(this.getTestClass().getJavaClass()).get();
    }
}

以后:

@RunWith(ContainerRunner.class)
@Singleton
public class ContainedTest {

    @Inject
    private Logger logger;  // this works

    @Test
    public void testSomething() {
        ...
    }
}

感谢您的任何见解。

到目前为止,最好使用两者之一 Weld JUnit 5 Extensions

但要直接回答您的问题,您可以(3 年后)编写实现 TestInstanceFactory 的扩展,即:

class ContainerExtension implements TestInstanceFactory {
    private WeldContainer container;

    @Override public Object createTestInstance(TestInstanceFactoryContext factoryContext, ExtensionContext extensionContext) throws TestInstantiationException {
        return container.select(this.getTestClass().getJavaClass()).get();
    }
}

然后您的测试使用 @ExtendWith(ContainerExtension.class) 而不是 @RunWith(ContainerRunner.class)