使用 @RegisterExtension 进行 JUnit5 编程扩展注册
上次更新:2024 年 1 月 8 日
1. 概述
JUnit5 提供了多种注册扩展的方法。有关其中一些方法的概述,请参阅我们的 JUnit 5 扩展指南。
在本快速教程中,我们将重点介绍使用@RegisterExtension 注解对 JUnit 5 扩展进行编程注册。
2. @RegisterExtension
我们可以将此注解应用于测试类中的字段。此方法的一个优势是,我们可以直接在测试内容中将扩展作为对象访问。
JUnit 将在适当的阶段调用扩展方法。
例如,如果扩展实现了 BeforeEachCallback,JUnit 将在执行测试方法之前调用其相应的接口方法。
3. 使用带有静态字段的 @RegisterExtension
当与静态字段一起使用时,JUnit 会在基于 @ExtendWith 的扩展应用之后,应用此扩展的方法。
此外,JUnit 将调用扩展的类级别和方法级别回调。
例如,以下扩展同时包含 beforeAll 和 beforeEach 实现
public class LoggingExtension implements
BeforeAllCallback, BeforeEachCallback {
// logger, constructor etc
@Override
public void beforeAll(ExtensionContext extensionContext)
throws Exception {
logger.info("Type {} In beforeAll : {}",
type, extensionContext.getDisplayName());
}
@Override
public void beforeEach(ExtensionContext extensionContext) throws Exception {
logger.info("Type {} In beforeEach : {}",
type, extensionContext.getDisplayName());
}
public String getType() {
return type;
}
}
让我们将此扩展应用于测试的静态字段
public class RegisterExtensionTest {
@RegisterExtension
static LoggingExtension staticExtension = new LoggingExtension("static version");
@Test
public void demoTest() {
// assertions
}
}
输出显示了 beforeAll 和 beforeEach 方法的消息
Type static version In beforeAll : RegisterExtensionTest
Type static version In beforeEach : demoTest()
4. 使用带有实例字段的 @RegisterExtension
如果我们将 RegisterExtension 与非静态字段一起使用,JUnit 仅会在处理所有 TestInstancePostProcessor 回调之后应用该扩展。
在这种情况下,JUnit 将忽略类级别回调,例如 beforeAll。
在上面的示例中,让我们从 LoggingExtension 中删除 static 修饰符
@RegisterExtension
LoggingExtension instanceLevelExtension = new LoggingExtension("instance version");
现在 JUnit 将仅调用 beforeEach 方法,如输出所示
Type instance version In beforeEach : demoTest()
5. 结论
在本文中,我们概述了使用 @RegisterExtension 以编程方式注册 JUnit 5 扩展的方法。
我们还介绍了将扩展应用于静态字段与实例字段的区别。
支持本文的代码可在 GitHub 上获取。 一旦你以 Baeldung Pro 会员 身份登录,就开始学习并在项目上进行编码。















