Java 如何替换JUnit5中的@Rule注释?

Java 如何替换JUnit5中的@Rule注释?,java,junit5,junit-rule,Java,Junit5,Junit Rule,我在测试中使用wiremock,有这样一行代码: @Rule public WireMockRule wireMockRule = new WireMockRule(8080); 我想切换到JUnit5。因此,我添加了下一个依赖项(使用gradle): 但当我尝试导入@Rule注释时,没有任何建议。 我是否需要添加另一个junit依赖模块?或者Junit5中不支持规则?如果没有,我如何替换@Rule注释以使测试再次工作? 谢谢。一般来说,您在JUnit 4中使用@Rule和@ClassRule

我在测试中使用wiremock,有这样一行代码:

@Rule
public WireMockRule wireMockRule = new WireMockRule(8080);
我想切换到JUnit5。因此,我添加了下一个依赖项(使用gradle):

但当我尝试导入@Rule注释时,没有任何建议。 我是否需要添加另一个junit依赖模块?或者Junit5中不支持规则?如果没有,我如何替换@Rule注释以使测试再次工作?
谢谢。

一般来说,您在JUnit 4中使用
@Rule
@ClassRule
所做的工作应该在JUnit 5中完成,并且相关联的功能在JUnit 5中提供了一个非常紧密的特性。
它作为标准JUnit生命周期挂钩工作,但它是在
扩展中提取的。与
@规则
类似,可以为测试类添加所需数量的
扩展

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

  • 保持JUnit4的方式(JUnit5拥有允许执行JUnit3或JUnit4测试的JUnitVintage部分)
  • @规则
    重写为
    扩展名
  • 在类的每个测试中,使用
    @beforeach
    @AfterEach
    钩子方法执行
    WireMockRule
    (启动服务器,执行测试并停止服务器)执行的实际处理
  • 使用第三个库以JUnit5扩展方式实现与WireMockRule等效的功能,例如

请注意,.

JUnit4注释
@Rule
@ClassRule
中已经讨论过的问题在JUnit5中不存在。基本上,有一个新的扩展模型可以用来实现具有相同功能的扩展。这些扩展可以与带注释的
@extendw一起使用

JUnit jupiter migrationsupport模块中对JUnit 4规则子集的迁移支持有限。不幸的是,它仅限于
ExternalResource
Verifier
的子类

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

  • 使用JUnitVintage引擎并排运行JUnit4测试和JUnit5测试
  • 在测试代码中自己启动和停止服务器
  • 使用第三方扩展,如或
  • 该项目允许您通过两种方式解决此问题

    您可以通过
    DangerousRuleAdapter
    使用其对JUnit4规则的支持,该适配器将尝试将任何JUnit4规则转换为
    插件

    @ExtendWith(PluginExtension.class)
    公共类危险规则适配器示例测试{
    @插件
    专用危险规则适配器=
    新的危险规则适配器(新的WireMockRule());
    @试验
    取消测试(){
    //在这里使用wiremock规则
    WireMockRule=adapter.get();
    }
    
    规则适配器无法使用检查测试类或测试方法的规则,但会尝试运行该规则

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

    TemporaryFolder TemporaryFolder=newtemporaryfolder();
    //让我们使用这个临时文件夹和一些测试代码
    ExecuteThrole(临时文件夹,()->{
    //在这里,规则是有效的_
    CallSomeThingStatus(temporaryFolder.getRoot());
    });
    
    通过使用
    PluginExtension
    TestResource.of

    @ExtendWith(PluginExtension.class)
    类TestResourceIsActiveDuringTest{
    私有wiremock服务器;
    @插件
    私有TestResource someResource=TestResource.from(()->server.start(),
    ()->server.stop());
    
    检查这篇漂亮的文章没有直接替换,Junit Jupiter使用
    @Extension
    而不是
    @Rlue
    ;开发人员需要移植他们的代码-WireMock没有。你可以自己实现
    @Extension
    testCompile('org.junit.jupiter:junit-jupiter-engine:5.1.1')