如何替换 JUnit 5 中的 WireMock @Rule 注释?

How to replace WireMock @Rule annotation in JUnit 5?

我在测试中使用 WireMock 并有这样一行代码:

@Rule
public WireMockRule wireMockRule = new WireMockRule(8080);

我想切换到 JUnit 5。所以我添加了下一个依赖项(使用 Gradle):

testCompile('org.junit.jupiter:junit-jupiter-engine:5.1.1')

但是当我尝试导入 @Rule 注释时没有任何建议。

是否需要再添加一个JUnit依赖模块?还是 JUnit 5 不支持规则?如果没有,我如何替换 @Rule 注释以使测试再次工作?

一般来说,您在 JUnit 4 中使用 @Rule@ClassRule 所做的工作应该使用 @ExtendWith and Extension 完成,相关联的功能在 JUnit 5 中提供了非常接近的功能。
它作为标准 JUnit 生命周期挂钩工作,但它是在 Extension class 中提取的。与 @Rule 类似,可以为测试 class.

添加所需数量的 Extension

要处理此问题,您有以下几种可能的方法:

  • 保持 JUnit 4 的方式(JUnit 5 拥有允许执行 JUnit 3 或 4 测试的 JUnit Vintage 部分)。
  • @Rule 重写为 Extension
  • @BeforeEach@AfterEach 的每个 class 测试中执行 WireMockRule 完成的实际处理(启动服务器,执行测试并停止服务器)钩子方法。
  • 使用以 JUnit 5 扩展方式实现 WireMockRule 等价物的第三个库,例如 https://github.com/lanwen/wiremock-junit5

请注意,您的问题已在 the JUnit 5 Issues 中讨论过。

JUnit 4 注释 @Rule@ClassRule 在 JUnit 5 中不存在。基本上有一个新的扩展模型可用于实现具有相同功能的扩展。这些扩展可以与 @ExtendWith 注释一起使用。

junit-jupiter-migrationsupport 模块中对 JUnit 4 规则子集的迁移支持有限。不幸的是,它仅限于 ExternalResourceVerifier.

的子类

在 wiremock 正式支持 JUnit 之前,您有一些解决方法:

  1. 运行 JUnit 4 测试与 JUnit 5 测试并排使用 junit-vintage-engine.
  2. 在测试代码中自行启动和停止服务器。
  3. 使用第 3 方扩展,例如 wiremock-junit5 or wiremock-extension

https://github.com/webcompere/java-test-gadgets 项目可让您通过多种方式解决此问题。

您可以通过 DangerousRuleAdapter 使用其对 JUnit 4 规则的支持 - 这将尝试将任何 JUnit 4 规则转换为 Plugin:

@ExtendWith(PluginExtension.class)
public class DangerousRuleAdapterExampleTest {
    @Plugin
    private DangerousRuleAdapter<WireMockRule> adapter = 
        new DangerousRuleAdapter<>(new WireMockRule());

    @Test
    void theTest() {
        // use wiremock rule here
        WireMockRule rule = adapter.get();
    }

规则适配器无法与检查测试 class 或测试方法的规则一起使用,但请尝试 运行 规则。

还支持 运行 一些代码的规则:

    TemporaryFolder temporaryFolder = new TemporaryFolder();

    // let's use this temp folder with some test code
    executeWithRule(temporaryFolder, () -> {
        // here, the rule is _active_
        callSomethingThatUses(temporaryFolder.getRoot());
    });

并且您可以使用 PluginExtensionTestResource.of

轻松创建自己的新 JUnit 5 插件
@ExtendWith(PluginExtension.class)
class TestResourceIsActiveDuringTest {
    private WireMockServer server;

    @Plugin
    private TestResource someResource = TestResource.from(() -> server.start(),
                                                          () -> server.stop());

来自JUnit 5 user guide

@Rule and @ClassRule no longer exist; superseded by @ExtendWith and @RegisterExtension. See also "Limited JUnit 4 Rule Support".

但是,与 一样,WireMock 自版本 2.31.0 起具有完整的 JUnit Jupiter 支持:

// New JUnit 5 extension
@WireMockTest
class DeclarativeWireMockTest {

    @Test
    void test_something_with_wiremock(WireMockRuntimeInfo wmRuntimeInfo) {
        // The static DSL will be automatically configured for you
        stubFor(get("/static-dsl").willReturn(ok()));
      
        // Instance DSL can be obtained from the runtime info parameter
        WireMock wireMock = wmRuntimeInfo.getWireMock();
        wireMock.register(get("/instance-dsl").willReturn(ok()));
       
        // Info such as port numbers is also available
        int port = wmRuntimeInfo.getHttpPort();
        
        // Do some testing...
    }

}

更多信息,请参考corresponding docs

WireMock 2.31.0 现在正式支持 JUnit 5 Jupiter。

文档在这里:http://wiremock.org/docs/junit-jupiter/