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



我在测试中使用了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所做的应该用@ExtendWithExtension来完成,这些在 JUnit 5.
中提供了非常接近的功能,它作为标准的 JUnit 生命周期钩子工作,但它是在Extension类中提取的。与@Rule类似,可以根据需要为测试类添加任意数量的Extension

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

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

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

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. 使用第三方扩展,如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());
});

您可以使用PluginExtensionTestResource.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...
}
}

有关更多信息,请参阅相应的文档。

最新更新