@springboottest用于验证多组件协同工作的集成测试,如controller-service-repository交互、自定义配置加载、真实数据源操作及外部依赖行为,需配合webenvironment、@activeprofiles和@mockbean等控制环境与依赖。

@SpringBootTest 是 Spring Boot 提供的用于启动完整 Spring 应用上下文的测试注解,适合编写需要真实 Bean、配置、数据源、Web 环境等参与的集成测试。
什么时候该用 @SpringBootTest
当你需要验证多个组件协同工作是否正常时使用,比如:
- Controller 层调用 Service、Repository 是否能正确返回结果
- 自定义配置类(
@Configuration)是否被正确加载 - 数据库操作(JPA/MyBatis)在真实 DataSource 下是否执行成功
- 消息队列、缓存、定时任务等外部依赖的行为是否符合预期(需配合 Testcontainers 或嵌入式服务)
基础用法:启动完整上下文
最简写法是直接加注解,Spring Boot 会自动扫描主配置类(含 @SpringBootApplication 的类):
@SpringBootTest
class UserServiceIntegrationTest {
@Autowired
private UserService userService;
@Test
void shouldFindUserById() {
User user = userService.findById(1L);
assertThat(user).isNotNull();
}
}
注意:默认会加载整个应用上下文,启动较慢。如只需部分 Bean,可用 classes 属性指定配置类:
@SpringBootTest(classes = {UserService.class, UserRepoImpl.class, TestConfig.class})
控制 Web 环境行为
通过 webEnvironment 属性决定是否启动 Web 容器:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
-
MOCK(默认):创建 MockMvc 实例,不启动真实 HTTP 服务器 -
RANDOM_PORT:启动真实 Tomcat/Jetty,端口随机,适合测试完整 HTTP 流程 -
DEFINED_PORT:使用server.port配置的端口(慎用,易端口冲突) -
NONE:不启动 Web 环境,纯非 Web 集成测试
例如测试 REST 接口:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class UserControllerIntegrationTest {
@Autowired
private TestRestTemplate restTemplate;
@Test
void shouldReturnUserWhenGetById() {
ResponseEntity<user> response = restTemplate.getForEntity("/api/users/1", User.class);
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
}
}</user>
隔离测试环境与生产配置
集成测试应避免读取真实配置(如线上数据库地址)。推荐做法:
- 在
src/test/resources/application-test.yml中提供专用测试配置 - 用
@ActiveProfiles("test")激活该配置 - 对数据库,优先使用 H2 内存库或 Testcontainers
- 敏感配置(如密钥)可通过
@TestConfiguration或@MockBean替换
示例:
@SpringBootTest
@ActiveProfiles("test")
class PaymentServiceIntegrationTest {
@MockBean
private SmsClient smsClient; // 替换真实短信服务
@Test
void shouldProcessPaymentWithoutSendingSms() {
paymentService.process(new PaymentRequest(...));
verify(smsClient, never()).send(any());
}
}
不复杂但容易忽略的是:确保测试类在正确的包路径下,让 Spring 能扫描到你的配置和组件;同时合理使用 @MockBean 和 @TestConfiguration 控制依赖边界,避免测试因外部系统不可用而失败。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










