@springboottest 是加载 spring boot 应用上下文的关键注解,它自动启动完整上下文、支持 bean 注入和属性加载;可通过 webenvironment 控制 web 容器行为,classes 属性可缩小上下文范围提升速度,并需确保 spring-boot-starter-test 依赖及 junit 5 兼容性。

要在测试类中加载 Spring Boot 应用上下文,关键不是“手动加载”,而是让测试运行在 Spring 管理的环境中——即通过正确注解触发框架自动创建并缓存 ApplicationContext。
必须添加 @SpringBootTest 注解
这是最直接有效的方式。它会启动一个完整的 Spring Boot 应用上下文,自动扫描主配置类(如标注 @SpringBootApplication 的类),加载所有自动配置、Bean 定义和外部属性。
- 不加该注解时,测试运行在纯 JUnit 环境,@Autowired 一律为 null
- 加了之后,测试类成为 Spring 上下文的一部分,可正常注入 @Service、@Repository、@ConfigurationProperties 等 Bean
- 默认行为等价于启动整个应用(不含 Web 服务器),适合集成测试
按需指定 webEnvironment 模式
如果测试涉及 HTTP 层(比如调用 Controller),需明确控制是否启动嵌入式 Web 容器:
- RANDOM_PORT:启动真实 Web 服务器,分配随机端口,配合 TestRestTemplate 使用
- MOCK:不启动服务器,使用 MockMvc 模拟请求,性能更好、更轻量
- DEFINED_PORT:固定端口(慎用,易端口冲突)
- NONE:完全不加载 Web 相关组件(默认值)
用 classes 属性缩小上下文范围
全量加载上下文慢且不必要。可通过 classes 显式声明只加载特定配置类或组件:
- 例如:@SpringBootTest(classes = {UserService.class, DataSourceConfig.class})
- 这样跳过包扫描和自动配置,仅注册指定类及其依赖,显著提升测试启动速度
- 适用于单元级集成测试,尤其在模块化项目中隔离验证某几个 Bean
注意测试依赖与运行器兼容性
确保项目已引入 spring-boot-starter-test,它默认包含 JUnit 5 和 Spring Test 支持:
- Spring Boot 2.2+ 默认使用 JUnit 5,无需 @RunWith;若还在用 JUnit 4,才需搭配 @RunWith(SpringRunner.class)
- IDE(如 IntelliJ)需识别测试框架版本,否则可能无法发现或运行测试方法
- 多个测试类若使用相同 @SpringBootTest 配置(如相同 classes、properties、activeProfiles),Spring 会自动复用上下文,避免重复初始化











