JUnit 5 扩展模型是什么
JUnit 5 通过 @ExtendWith 注册扩展点(BeforeEachCallback、ParameterResolver、TestExecutionExceptionHandler 等),实现依赖注入、条件执行与自定义重试等能力。条件执行注解也属于扩展体系:@EnabledOnOs、@EnabledIfEnvironmentVariable、@DisabledIf 等,用来让用例适配不同环境。
基本信息
| 注册方式 | @ExtendWith(扩展类) 或配置自动注册 |
|---|---|
| 常用回调 | BeforeEachCallback、AfterEachCallback、ParameterResolver |
| 异常处理 | TestExecutionExceptionHandler 处理或转换失败 |
| 条件执行 | @EnabledOnOs、@EnabledIfEnvironmentVariable、@DisabledIf |
| 顺序控制 | 多个扩展对顺序有要求时用 @Order 明确 |
| 生态集成 | Mockito、Spring 等通过扩展接入测试上下文 |
扩展示例
扩展示例
@ExtendWith(MockitoExtension.class)
class OrderTest {
@Mock Mailer mailer;
@InjectMocks OrderService service;
}
// @ExtendWith 可叠加多个扩展,执行顺序用 @Order 控制常用扩展点
| 扩展点 | 用途 |
|---|---|
| BeforeEachCallback | 每个测试执行前的准备逻辑 |
| ParameterResolver | 把自定义对象注入测试参数 |
| TestExecutionExceptionHandler | 处理或转换失败异常 |
| TestWatcher | 监听成功、失败与跳过状态 |
| InvocationInterceptor | 拦截调用做重试或计时 |
典型使用场景
- 依赖注入:把 mock、临时目录等注入测试方法。
- 条件执行:按操作系统、环境变量开关用例。
- 断言增强:扩展失败消息收集,输出更可读。
- 重试策略:对不稳定外部依赖做有限重试并记录。
- 资源管理:统一管理测试容器与外部服务的起停。
- 自研扩展:团队统一测试基座能力,减少复制。
- 失败增强:附加自定义上下文,缩短排查路径。
- 并行隔离:并发执行下管理共享资源的一致性。
- 环境适配:CI 与本地差异化执行时,用条件注解声明差异。
扩展内部吞掉异常又不上抛,用例失败信息会丢失。
多个扩展对执行顺序有要求却未评估 @Order,会产生随机失败。
扩展是横切能力:集中管理重试、日志与资源,避免每个测试类重复实现。
优先使用成熟扩展(Mockito、Spring 提供),自研扩展控制数量与复杂度。
扩展与生命周期回调的边界要清晰:选错层次会产生时机错误。