1

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

在 JUnit 5 中,扩展应该取代跑步者和规则。然而,我无法像使用 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() {
        ...
    }
}

感谢您的任何见解。

4

1 回答 1

1

到目前为止,最好使用两个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).

于 2020-10-14T04:12:04.603 回答