@springboottest 默认加载含 @springbootapplication 的主配置类并启动完整上下文,支持 none、mock、random_port、defined_port 四种 web 环境模式,可通过指定 classes、排除自动配置、切换 profile 等方式优化加载范围,结合 @autowired、@autoconfiguremockmvc、@transactional 等实现高效集成测试。

在 Spring Boot 中使用 @SpringBootTest 加载完整上下文进行集成测试,核心是让测试启动一个接近真实运行环境的 Spring 应用上下文,从而验证组件间协作、配置生效、数据库连接、Bean 注入等是否正常。
理解 @SpringBootTest 的默认行为
加了 @SpringBootTest 的测试类,默认会尝试加载整个 Spring Boot 应用的主配置(即含 @SpringBootApplication 的类),并启动完整上下文。它不是只扫描测试所在包,而是按常规启动逻辑查找主配置类 —— 通常要求项目中存在且仅有一个 @SpringBootApplication 类,否则需显式指定。
- 若项目结构规范(主类在根包下,如
com.example.MyApp),一般无需额外配置 - 若主类不在默认位置或有多个,可用
@SpringBootTest(classes = {MyApp.class})显式指定 - 默认使用
WebEnvironment.MOCK(模拟 Servlet 环境,不启动真实服务器),适合多数 Web 层集成测试
选择合适的 Web 环境模式
根据测试目标决定是否启动真实 Web 容器:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
@SpringBootTest(webEnvironment = WebEnvironment.NONE):纯非 Web 上下文,不加载 Web 相关 Bean(如 DispatcherServlet) -
@SpringBootTest(webEnvironment = WebEnvironment.MOCK):加载 Web 环境但用 MockMvc 模拟请求,性能好、隔离性强,推荐用于 Controller 测试 -
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT):启动嵌入式容器(如 Tomcat),监听随机端口,适合需要真实 HTTP 调用的场景(如 Feign、RestTemplate 端到端验证) -
@SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT):使用application.properties中定义的固定端口(如server.port=8080),注意避免端口冲突
控制上下文加载范围与配置
完整上下文可能加载大量无关 Bean,拖慢测试速度。可通过以下方式优化:
- 使用
@TestConfiguration定义测试专用配置类,替代生产配置中的某些 Bean(如用 H2 替换 MySQL) - 通过
@Import或@ContextConfiguration指定最小必要配置类,缩小上下文范围 - 利用
@ActiveProfiles("test")切换 profile,在application-test.yml中覆盖数据源、缓存等配置 - 禁用自动配置:用
@SpringBootTest(exclude = {DataSourceAutoConfiguration.class})排除不需要的模块
注入与验证常用组件
上下文加载成功后,可直接 @Autowired 注入各类 Bean 进行验证:
- Service、Repository、Custom Bean 都可正常注入和调用
- Web 场景下配合
@AutoConfigureMockMvc获取MockMvc实例,发起模拟 HTTP 请求 - 使用
@LocalServerPort获取真实启动端口(仅限RANDOM_PORT或DEFINED_PORT) - 测试数据库操作时,搭配
@Transactional可让每个测试方法自动回滚,避免数据污染
不复杂但容易忽略的是:确保测试类位于 src/test/java 下,且依赖中包含 spring-boot-starter-test;同时检查 spring.main.banner-mode=off 等日志设置,避免干扰测试输出。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










