如何替换 JUnit 5 中的 WireMock @Rule 注释?
How to replace WireMock @Rule annotation in JUnit 5?
我在测试中使用 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
and Extension
完成,相关联的功能在 JUnit 5 中提供了非常接近的功能。
它作为标准 JUnit 生命周期挂钩工作,但它是在 Extension
class 中提取的。与 @Rule
类似,可以为测试 class.
添加所需数量的 Extension
要处理此问题,您有以下几种可能的方法:
- 保持 JUnit 4 的方式(JUnit 5 拥有允许执行 JUnit 3 或 4 测试的 JUnit Vintage 部分)。
- 将
@Rule
重写为 Extension
。
- 在
@BeforeEach
和 @AfterEach
的每个 class 测试中执行 WireMockRule
完成的实际处理(启动服务器,执行测试并停止服务器)钩子方法。
- 使用以 JUnit 5 扩展方式实现 WireMockRule 等价物的第三个库,例如 https://github.com/lanwen/wiremock-junit5
请注意,您的问题已在 the JUnit 5 Issues 中讨论过。
JUnit 4 注释 @Rule
和 @ClassRule
在 JUnit 5 中不存在。基本上有一个新的扩展模型可用于实现具有相同功能的扩展。这些扩展可以与 @ExtendWith
注释一起使用。
junit-jupiter-migrationsupport 模块中对 JUnit 4 规则子集的迁移支持有限。不幸的是,它仅限于 ExternalResource
和 Verifier
.
的子类
在 wiremock 正式支持 JUnit 之前,您有一些解决方法:
- 运行 JUnit 4 测试与 JUnit 5 测试并排使用 junit-vintage-engine.
- 在测试代码中自行启动和停止服务器。
- 使用第 3 方扩展,例如 wiremock-junit5 or wiremock-extension。
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();
}
规则适配器无法与检查测试 class 或测试方法的规则一起使用,但请尝试 运行 规则。
还支持 运行 一些代码的规则:
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());
@Rule
and @ClassRule
no longer exist; superseded by @ExtendWith
and @RegisterExtension
. See also "Limited JUnit 4 Rule Support".
但是,与 一样,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...
}
}
更多信息,请参考corresponding docs。
WireMock 2.31.0 现在正式支持 JUnit 5 Jupiter。
我在测试中使用 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
and Extension
完成,相关联的功能在 JUnit 5 中提供了非常接近的功能。
它作为标准 JUnit 生命周期挂钩工作,但它是在 Extension
class 中提取的。与 @Rule
类似,可以为测试 class.
Extension
要处理此问题,您有以下几种可能的方法:
- 保持 JUnit 4 的方式(JUnit 5 拥有允许执行 JUnit 3 或 4 测试的 JUnit Vintage 部分)。
- 将
@Rule
重写为Extension
。 - 在
@BeforeEach
和@AfterEach
的每个 class 测试中执行WireMockRule
完成的实际处理(启动服务器,执行测试并停止服务器)钩子方法。 - 使用以 JUnit 5 扩展方式实现 WireMockRule 等价物的第三个库,例如 https://github.com/lanwen/wiremock-junit5
请注意,您的问题已在 the JUnit 5 Issues 中讨论过。
JUnit 4 注释 @Rule
和 @ClassRule
在 JUnit 5 中不存在。基本上有一个新的扩展模型可用于实现具有相同功能的扩展。这些扩展可以与 @ExtendWith
注释一起使用。
junit-jupiter-migrationsupport 模块中对 JUnit 4 规则子集的迁移支持有限。不幸的是,它仅限于 ExternalResource
和 Verifier
.
在 wiremock 正式支持 JUnit 之前,您有一些解决方法:
- 运行 JUnit 4 测试与 JUnit 5 测试并排使用 junit-vintage-engine.
- 在测试代码中自行启动和停止服务器。
- 使用第 3 方扩展,例如 wiremock-junit5 or wiremock-extension。
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();
}
规则适配器无法与检查测试 class 或测试方法的规则一起使用,但请尝试 运行 规则。
还支持 运行 一些代码的规则:
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
@ExtendWith(PluginExtension.class)
class TestResourceIsActiveDuringTest {
private WireMockServer server;
@Plugin
private TestResource someResource = TestResource.from(() -> server.start(),
() -> server.stop());
@Rule
and@ClassRule
no longer exist; superseded by@ExtendWith
and@RegisterExtension
. See also "Limited JUnit 4 Rule Support".
但是,与
// 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...
}
}
更多信息,请参考corresponding docs。
WireMock 2.31.0 现在正式支持 JUnit 5 Jupiter。