最常用方式是测试类继承BaseTest基类,集中管理配置加载、状态重置等通用逻辑,子类专注业务断言;配合@TestConfiguration隔离测试Bean,注意资源释放与线程安全。

直接让测试类继承 BaseTest 是最常用也最清晰的方式,核心是把通用初始化、资源管理、配置加载等逻辑集中到基类中,子类只需专注写业务断言。
定义 BaseTest 基类封装通用逻辑
创建一个抽象或普通类 BaseTest,用 @BeforeAll、@BeforeEach 等 JUnit 5 注解统一处理共享动作:
- 通过
@BeforeAll加载全局配置(如 Spring 上下文、Mockito 初始化) - 用
@BeforeEach重置状态(清空 Mock、重置计数器、开启事务回滚) - 在构造方法或字段中注入常用工具(如
ObjectMapper、TestRestTemplate) - 提供受保护的便捷方法,比如
assertValid(User user)或mockUserService()
子类继承并按需覆盖/扩展
具体测试类直接 extends BaseTest,不需要重复写 setup 代码:
- 若某测试需要额外初始化,可重写
@BeforeEach方法,先调super.beforeEach()再追加逻辑 - 若某个测试不希望启用事务回滚,可在该测试类上加
@Transactional(propagation = Propagation.NOT_SUPPORTED)覆盖默认行为 - 避免在
BaseTest中写具体业务相关字段,保持基类纯粹性
配合 TestConfiguration 隔离测试专用 Bean
如果使用 Spring Boot Test,推荐将测试专用配置抽成 @TestConfiguration 类,放在 BaseTest 内部或同包下:
立即学习“Java免费学习笔记(深入)”;
- 用
@TestConfiguration定义轻量级替代 Bean(比如内存 H2 数据源、Stubbed Feign Client) - 在
BaseTest上用@Import(MyTestConfig.class)统一引入 - 这样既避免污染主配置,又保证所有继承类自动获得一致测试环境
注意生命周期与静态资源管理
继承方式简单,但要注意资源释放和线程安全:
-
@AfterEach中清理线程局部变量、关闭临时文件句柄、清除ThreadLocal缓存 - 避免在
BaseTest中声明静态可变状态(如 static Map),否则多测试并发时可能互相干扰 - 若用嵌入式服务(如 WireMock、TestContainer),建议在
@BeforeAll启动、@AfterAll关闭,并加同步控制


















