@RegisterExtension
的文档提到了一些有关实例注入的内容:
扩展将在测试类实例化后注册,毕竟
有机会对测试实例进行后处理 (可能会将要使用的扩展实例注入带注释的字段中)。TestInstancePostProcessor
JUnit 中是否有任何后处理器可以自动为扩展执行此操作,或者这只是在谈论人们将来可能构建的东西?
在我们的例子中,我发现我们的很多扩展结果都是这样的:
@RegisterExtension
public final TempFolderExtension temp = new TempFolderExtension();
@RegisterExtension
public final SomeFactoryExtension factory = new SomeFactoryExtension(temp);
像 PicoContainer 这样的容器可以自动找出如何构造实例。如果我们能写就太好了,
@RegisterExtension
public TempFolderExtension temp;
@RegisterExtension
public SomeFactoryExtension factory;
注释处理器或运行时注入器可以填补其余部分。此类扩展之间的依赖关系也会影响它们的运行顺序。
@RegisterExtension
时,您必须手动构建扩展实例。阅读
https://junit.org/junit5/docs/current/user-guide/#extensions5.2.2
@ExtendWith(TempFolderExtension.class)
static final class SomeTest {
public TempFolderInterface temp;
@Test
void test() {
...
}
}
但是,如果您想按照问题中的建议进行扩展,那么实现起来会很简单。这是 ExtensionInjector
,此类扩展的有效实现。
final class ExtensionInjector implements TestInstancePostProcessor {
@Override
public void postProcessTestInstance(Object testInstance, ExtensionContext context) throws Exception {
List<Field> fields = ReflectionSupport.findFields(
testInstance.getClass(),
field -> AnnotationSupport.isAnnotated(field, RegisterExtension.class),
HierarchyTraversalMode.BOTTOM_UP);
for (Field field : fields) {
field.trySetAccessible();
if (field.get(testInstance) == null) {
field.set(testInstance, ReflectionSupport.newInstance(field.getType()));
}
}
}
}
您可以将此扩展添加到您的项目中如 JUnit 5 用户指南中所述。