JUnit 5 真的可以注入扩展实例吗?

问题描述 投票:0回答:2

@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;
注释处理器或运行时注入器可以填补其余部分。

此类扩展之间的依赖关系也会影响它们的运行顺序。

java junit5 junit5-extension-model
2个回答
0
投票
简短的回答:不,这是不可能的,使用

@RegisterExtension

 时,您必须手动构建扩展实例。

阅读

https://junit.org/junit5/docs/current/user-guide/#extensions5.2.2


0
投票
我不知道这样的扩展是否存在。我认为在 JUnit 5 生态系统中使用

@ExtendWith

 注册扩展更为常见。然后,扩展可以将接口注入测试中。

@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 用户指南中所述

© www.soinside.com 2019 - 2024. All rights reserved.