83

我在我的测试中使用了 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注释以使测试再次工作?

4

5 回答 5

47

一般来说,您@Rule@ClassRuleJUnit 4 中所做的事情应该被完成,@ExtendWith并且Extension相关的在 JUnit 5 中提供了一个非常接近的特性。
它作为标准的 JUnit 生命周期钩子工作,但它是在一个Extension类中提取的。并且与 类似@RuleExtension可以为测试类添加所需数量的 s。

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

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

请注意,您的问题已经在J​​Unit 5 问题中讨论过。

于 2018-06-24T18:08:00.487 回答
13

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

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

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

  1. 使用junit-vintage-engine并排运行 JUnit 4 测试和 JUnit 5 测试。
  2. 在测试代​​码中自己启动和停止服务器。
  3. 使用 3rd 方扩展,如wiremock-junit5wiremock-extension
于 2018-06-24T19:12:00.613 回答
3

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

此处的文档:http ://wiremock.org/docs/junit-jupiter/

于 2021-09-09T11:33:06.790 回答
0

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

您可以通过 - 使用它对 JUnit 4 规则的支持,DangerousRuleAdapter这将尝试将任何 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();
    }

规则适配器不能与检查测试类或测试方法的规则一起使用,但会很好地尝试运行规则。

还支持围绕某些代码运行规则:

    TemporaryFolder temporaryFolder = new TemporaryFolder();

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

PluginExtension您可以使用和轻松创建自己的新 JUnit 5 插件TestResource.of

@ExtendWith(PluginExtension.class)
class TestResourceIsActiveDuringTest {
    private WireMockServer server;

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

于 2021-02-05T09:25:04.210 回答
0

JUnit 5 用户指南

@Rule并且@ClassRule不再存在;@ExtendWith被和取代@RegisterExtension。另请参阅“有限的 JUnit 4 规则支持”

然而,正如Tom 所指出的,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...
    }

}

更多信息请参考相应的文档

于 2021-08-29T09:31:23.103 回答