使用工厂方法在 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)
。
使用 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)
。