如何在 JUnit5 中实现自定义运行器

How to implement a custom runner in JUnit5

是否有某种方法可以完全控制 JUnit5 中测试方法(包括 before/after 方法)的执行,类似于 JUnit4 @RunWith 注释)?

我正在尝试构建 JUnit5 Arquillian 扩展,但由于 Aquillian 基本上需要在容器中执行每个测试,因此当 运行从 Junit5 扩展中使用 Arquillian 时,我遇到了问题。

我的代码在这里:BasicJunit5ArquillianTest.java

测试应该运行所有方法(包括before/after)在单独的容器中,可以是单独的JVM、远程或嵌入式服务器或任何隔离的东西。我的扩展 运行s 来自 beforeEach 钩子的测试方法,使用 Arquillian 将测试 class 和 运行 传输到使用 LauncherFactory.create() 的容器中,收集测试结果并将它们传输回来.

问题是测试方法执行了两次 - 通过正常的 JUnit5 执行和通过我的 Arquillian 扩展从 beforeEach 挂钩。我想 运行 仅通过 Arquillian 进行测试并跳过方法的正常执行。

这在 JUnit5 扩展中可能吗? 或者我需要创建一个自定义测试引擎,可能会扩展 Jupiter 测试引擎?

没有扩展点 (yet?) 允许您定义测试的位置或方式 运行。对于线程来说已经是这样,这意味着无法在 JavaFX 应用程序线程或 Swing EDT 上 运行 它们。

您可能需要更深入地实施 engine 但这意味着用户必须在编写 Arquillian 测试或编写 Jupiter 测试之间做出选择。

更新:在接受此答案后发布的较新版本的 JUnit 5 中,JUnit 5 现在提供 InvocationInterceptor 扩展点,这正是实现自定义 运行ner 所需要的作为扩展,它可以完全控制测试的执行方式,甚至可以用完全不同的东西替换测试方法的主体(例如 运行 不同 JVM 中的测试和 return 结果).