@SpringBootTest 是 Spring Boot 单元测试中加载轻量级 Spring 上下文的核心注解,支持全量扫描、classes 精准指定、配置隔离、Web 环境按需启用四种模式,兼顾真实性与执行效率。

在 Spring Boot 单元测试中加载 Spring 环境,核心是使用 @SpringBootTest 注解启动一个轻量级的 Spring 应用上下文。它不是完整启动生产应用,而是按需构建测试所需的 Bean 容器,兼顾真实性和执行效率。
基础用法:默认加载全量上下文
最简单的方式就是直接加注解:
-
@SpringBootTest不带参数时,会扫描主启动类所在包及其子包,加载全部@Component、@Service、@Configuration等标注的类 - 适合集成测试,但启动慢、Bean 多(比如 1500+),尤其含数据库、Redis、MQ 等中间件时更明显
- 确保测试类位于
src/test/java下,且项目已引入spring-boot-starter-test
精准控制:指定 classes 加载最小必要上下文
避免加载无关 Bean,显著提速:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用
@SpringBootTest(classes = {UserService.class, UserMapper.class, TestConfig.class})显式声明只加载这些类及其依赖 - Spring 不会扫描其他路径,也不会初始化未声明的配置类或自动装配的第三方组件
- 适用于验证某个 Service 或 DAO 的逻辑,无需 Web 层或消息队列等整套环境
隔离配置:用测试专用配置替代主配置
防止测试污染生产配置,也便于模拟异常场景:
- 在
src/test/resources/下放独立的application.yml或application-test.yml,Spring Boot 默认优先加载该路径下的配置 - 用
@TestPropertySource(locations = "classpath:test-application.yml")指定额外配置文件 - 用
@SpringBootTest(properties = "spring.datasource.url=jdbc:h2:mem:testdb")直接覆盖关键属性,比如切到 H2 内存库
按需启用 Web 环境
测试 Controller 接口时才需要:
-
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE):默认值,不启动任何 Web 容器 -
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK):加载 Web 上下文,提供MockMvc,不占端口 -
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT):启动嵌入式容器(如 Tomcat),分配随机端口,适合@RestTemplate或真实 HTTP 调用测试
不复杂但容易忽略:真正影响加载速度的,往往不是注解本身,而是你是否限制了扫描范围、是否替换了重资源依赖、是否启用了懒加载(spring.main.lazy-initialization=true 可配合使用)。

















