Java 如何替换JUnit5中的@Rule注释?
我在测试中使用wiremock,有这样一行代码: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
@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')