从JUnit4迁移至JUnit5:Runner类替代方案咨询
JUnit5 没有直接对应
org.junit.runner.Runner 的类,但完全可以不依赖 Vintage 引擎完成迁移 JUnit4 里的 org.junit.runner.Runner 是自定义测试执行逻辑的核心,但 JUnit5 采用了全新的架构,没有直接等价的类。不过你完全能摆脱 JUnit Vintage 完成迁移,具体要根据你的 Runner 实现的功能来选择对应的 JUnit5 机制:
1. 要是你的 Runner 管的是测试类的执行流程
如果你的 Runner 主要负责控制测试类的执行顺序、生命周期回调(比如初始化、清理),或者自定义测试方法的发现逻辑,直接用 JUnit5 的 Extension 模型就行:
- 实现
BeforeAllCallback、AfterAllCallback这类接口,替代 Runner 里的全局生命周期控制 - 用
BeforeEachCallback、AfterEachCallback替换原来@Before、@After对应的逻辑 - 如果要做参数化或重复测试,用
TestTemplateInvocationContextProvider实现 - 异常处理可以用
TestExecutionExceptionHandler
2. 要是你的 Runner 支持自定义测试类型
如果你的 Runner 是为了支持非标准的测试定义(比如自定义注解、不是方法级的测试),那需要实现 JUnit5 的 TestEngine 接口:
TestEngine是 JUnit5 里测试引擎的核心,负责扫描发现自定义测试,以及执行这些测试- 你需要实现
discover方法来识别你的自定义测试,实现execute方法来处理测试执行逻辑 - 把自定义引擎注册后,JUnit Platform 会自动识别并运行它
迁移时要注意的点
- 彻底移除 JUnit4 相关依赖(比如
junit-4.13.2.jar),只保留 JUnit5 的核心依赖:junit-jupiter-api、junit-jupiter-engine等 - 把 JUnit4 的注解换成 JUnit5 的:比如用
org.junit.jupiter.api.Test替代org.junit.Test,@BeforeEach替代@Before,@AfterEach替代@After - JUnit5 不需要类似
@RunWith的注解,Extension 或 TestEngine 会自动生效
内容的提问来源于stack exchange,提问作者Dhanyaa Bharadwaj
相关产品推荐
相关产品推荐

