我在测试中使用了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
和Extension
来完成,这些在 JUnit 5.
中提供了非常接近的功能,它作为标准的 JUnit 生命周期钩子工作,但它是在Extension
类中提取的。与@Rule
类似,可以根据需要为测试类添加任意数量的Extension
。
要处理此问题,您有几种可能的方法:
保持 JUnit 4 的方式(JUnit 5 拥有允许执行 JUnit- 3 或 4 测试的 JUnit Vintage 部分(。
- 将
@Rule
重写为Extension
。 - 使用
@BeforeEach
和@AfterEach
hook 方法在类的每个测试中执行WireMockRule
完成的实际处理(启动服务器、执行测试和停止服务器(。 - 使用第三个库,该库以JUnit 5扩展方式实现与WireMockRule等效的功能,例如 https://github.com/lanwen/wiremock-junit5
请注意,您的问题已在 JUnit 5 问题中讨论过。
JUnit 4 注释@Rule
和@ClassRule
在 JUnit 5 中不存在。基本上,有一个新的扩展模型可用于实现具有相同功能的扩展。这些扩展名可以与@ExtendWith
注释一起使用。
在 junit-jupiter-migrationsupport模块中,对 JUnit 4 规则子集的迁移支持有限。不幸的是,它仅限于ExternalResource
和Verifier
的子类。
在wiremock正式支持JUnit之前,您有一些解决方法:
- 使用junit-vintage-engine并行运行 JUnit 4 测试与 JUnit 5 测试。
- 在测试代码中自行启动和停止服务器。
- 使用第三方扩展,如wiremock-junit5或wiremock-extension。
现在官方支持来自WireMock 2.31.0的JUnit 5 Jupiter。
文档在这里: http://wiremock.org/docs/junit-jupiter/
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();
}
规则适配器不能使用检查测试类或测试方法的规则,但可以很好地尝试运行规则。
还支持围绕某些代码运行规则:
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
和TestResource.of
轻松创建自己的新 JUnit 5 插件
@ExtendWith(PluginExtension.class)
class TestResourceIsActiveDuringTest {
private WireMockServer server;
@Plugin
private TestResource someResource = TestResource.from(() -> server.start(),
() -> server.stop());
来自 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...
}
}
有关更多信息,请参阅相应的文档。