@SpringBootTest用于加载完整Spring Boot上下文以支持@Autowired、@Transactional等容器特性,@ContextConfiguration适用于传统Spring或精细控制配置,@Import+@ExtendWith实现轻量级Bean测试。

在 Java 的 Spring 项目中做单元测试时,若需要真正启动 Spring 容器(比如测试 @Autowired 注入、@Transactional 行为、AOP 切面等),就得加载 Spring 上下文。这不是普通 JUnit 单元测试(不依赖容器),而是集成测试范畴,Spring 提供了完善的测试支持。
使用 @SpringBootTest 加载完整上下文
这是最常用、最直接的方式,适用于需要完整 Spring Boot 环境的场景:
- 标注在测试类上,Spring Boot 会自动扫描主配置类(如带有 @SpringBootApplication 的类)并构建上下文
- 默认加载全部配置和 Bean,启动速度较慢,但覆盖全面
- 可配合 @ActiveProfiles("test") 指定测试环境配置
- 若只想加载部分组件,可用 classes 属性指定配置类,例如:@SpringBootTest(classes = {TestConfig.class, UserService.class})
用 @ContextConfiguration 精细控制上下文
适合传统 Spring(非 Spring Boot)项目,或 Spring Boot 中需跳过自动配置、手动指定配置来源:
- @ContextConfiguration(classes = {...}):显式传入 Java 配置类
- @ContextConfiguration(locations = {"classpath:application-context.xml"}):加载 XML 配置文件
- 常与 @ExtendWith(SpringExtension.class)(JUnit 5)或 @RunWith(SpringRunner.class)(JUnit 4)搭配使用
避免重复加载,复用上下文
Spring 测试框架默认对相同配置的上下文进行缓存,同一 JVM 内多个测试类只要上下文定义一致,就只启动一次:
- 确保测试类的 @ContextConfiguration 或 @SpringBootTest 参数完全一致(包括 classes、locations、initializers 等)
- 不要在测试方法里用 new AnnotationConfigApplicationContext() 手动创建——这绕过了 Spring 测试上下文缓存机制
- 可加 @DirtiesContext 强制在测试前后重建上下文(仅在必要时,如测试修改了单例状态)
轻量级测试:@Import + @ExtendWith
如果只测一两个 Bean,不需要整个应用上下文,可组合使用:
- 用 @Import({ServiceA.class, DaoB.class}) 导入所需 Bean
- 搭配 @ExtendWith(SpringExtension.class) 启用 Spring 测试支持
- 再用 @TestConfiguration 内部定义测试专用 Bean(如 mock 的依赖)
- 这种方式启动快、隔离性好,适合模块化、分层测试
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











