【发布时间】:2018-03-28 11:06:11
【问题描述】:
我在使用 JUnit 5(5.0 或 5.1)和自定义扩展时遇到了麻烦。
我们正在使用服务加载器来加载所有实现,然后修改我们的扩展的引导方式。这些实现只能加载一次,所以我正在考虑使用ExtensionContext.Store 并将其放置在那里。然后,每个后续测试实例都将仅从 Store 加载它,而不是通过服务加载器。
现在,我什至知道分层上下文结构,并且我知道您可以通过ExtensionContext.getRoot() 获得一些“根”上下文。但是这个“根”上下文(JupiterEngineExtensionContext 的实例)并不是真正的根 - 每个测试实例都有不同的上下文。
假设您有FooTest 和BarTest,然后为它们中的每一个打印出getRoot():
org.junit.jupiter.engine.descriptor.JupiterEngineExtensionContext@1f9e9475
org.junit.jupiter.engine.descriptor.JupiterEngineExtensionContext@6c3708b3
因此尝试从 Store 检索以前存储的信息失败。
- 是否有意设置此限制?它使
ClassExtensionContext和JupiterEngineExtensionContext之间的界限变得非常模糊。 - 还有其他方法可以通过扩展全局存储一些信息吗?
这是我尝试与商店合作的(非常)简化的版本(基本上删除了所有其他信息)。我还添加了一些System.out.print() 电话来强调我所看到的。在两个测试类上执行这个扩展会得到我上面描述的结果:
public class MyExtension implements BeforeAllCallback {
@Override
public void beforeAll(ExtensionContext context) throws Exception {
System.out.println(context.getRoot());
if (context.getRoot().getStore(Namespace.create(MyExtension.class)).get("someIdentifier", String.class) == null) {
context.getRoot().getStore(Namespace.create(MyExtension.class)).put("someIdentifier", "SomeFooString");
} else {
// this is never executed
System.out.println("Found it, no need to store anything again!");
}
}
}
编辑:这是 GH(link) 上的一个最小项目,由 mvn clean install 运行,它显示了我看到的行为。
【问题讨论】:
-
getRoot()实际上不应该返回不同的实例。您如何运行测试? -
@MarcPhilipp 编辑了包含此问题的问题。该代码用于检查存储在
beforeAll阶段的值。如果未找到,则将其存储并稍后在扩展中检索和使用。两个使用的测试都只是受此扩展影响并执行此代码。 -
@MarcPhilipp 编辑了问题,现在有更完整的扩展代码。在两个不同的测试类(两个测试实例)上运行它会产生不同的根上下文实例,因此在调用之间不会保存任何内容。
-
正如 Sam 在下面所写,这已在 1.0.3 (github.com/junit-team/junit5/issues/1113) 中得到修复,但您应该将 1.1.0 与 Jupiter 5.1.0 一起使用。