Spring Boot集成测试需按场景选择合适注解:@WebMvcTest测HTTP链路,@DataJpaTest测JPA,@MybatisTest测MyBatis,@SpringBootTest配合Testcontainers或WireMock测外部依赖,并通过@Sql、@Transactional等保障数据隔离。

Spring Boot 项目的集成测试,核心是验证多个组件协同工作是否符合预期——比如 Controller 调用 Service、Service 调用 Repository、事务生效、配置加载正确、SQL 执行无误、外部接口(如 HTTP 客户端)行为可控等。它不是“启动整个应用跑一遍”,而是有策略地控制上下文范围和依赖真实度。
明确集成测试的边界:什么该测,什么不该放进来
集成测试不是单元测试的放大版,也不是@SpringBootTest一贴了事。关键判断标准是:是否需要验证跨层协作或真实中间件行为。
- 要测 HTTP 接口完整链路(含参数校验、序列化、全局异常处理器)?→ 用 @WebMvcTest + MockMvc,不启全量上下文
- 要测 JPA/Hibernate 的实体映射、关联查询、@Query SQL 是否写对?→ 用 @DataJpaTest,自动配 H2 或连接测试库
- 要测 MyBatis 的 XML 映射、动态 SQL、TypeHandler 行为?→ 配合 @MybatisTest(需引入 mybatis-spring-boot-starter-test)
- 要测消息发送/消费(如 Kafka、RabbitMQ)、定时任务触发、Redis 缓存穿透逻辑?→ 用 @SpringBootTest + Testcontainers 或嵌入式服务
- 要测多模块间 Feign 调用、网关路由、OAuth2 认证流?→ @SpringBootTest + 真实端口或 WireMock 模拟下游
推荐分层执行,避免“全量启动”成常态
@SpringBootTest 默认加载全部自动配置,容易拖慢测试速度、引入无关 Bean 导致干扰。建议按需缩小范围:
将后端 Java 接口文档转换为前端 TypeScript 类型定义(interface / type)。输入:飞书文档、Spring Boot 接口文档、Swagger/OpenAPI、手写 API 文档等。输出:包含请求参数与响应结果的 .md 文件,含完整 JSDoc 注释。触发关键词:Java 转 TS、接口转换、生成前端类型、接口文档转 TypeScript、DTO/VO/BO 转 interface、后端文档转前端类型、生成接口类型、类型定义生成。
- 加 @Import({YourConfig.class}) 只导入必要配置类,跳过扫描无关包
- 用 @SpringBootTest(webEnvironment = WebEnvironment.NONE) 关闭内嵌容器,纯服务层集成
- 指定 @SpringBootTest(classes = {OrderService.class, OrderRepository.class}) 显式声明要加载的类
- 配合 @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) 强制使用真实数据库(如 Docker 启的 MySQL)
处理外部依赖:真实 vs 模拟,要分清场景
集成测试的价值在于暴露环境差异,但不能因外部服务不稳定而让测试随机失败:
立即学习“Java免费学习笔记(深入)”;
- 数据库:优先用 Testcontainers 启真实 MySQL/PostgreSQL 容器,比 H2 更贴近生产;若必须用 H2,注意方言差异(如 LIMIT 语法、JSON 函数)
- HTTP 外部调用:用 WireMock 启本地 stub 服务,预设响应状态、延迟、错误码,验证重试、降级逻辑
- 消息中间件:Testcontainers 支持 Kafka、RabbitMQ,可验证发送后消费是否触发、DLQ 是否进入
- Redis:用 embedded-redis 或 Testcontainers,避免本地 Redis 版本与生产不一致导致 Lua 脚本失败
数据准备与清理:避免测试间污染
集成测试常涉及数据库操作,必须保障每个测试方法运行在干净状态:
- 用 @Sql 注解在测试方法前后执行 SQL 脚本(如 INSERT 测试数据 / DELETE 清理)
- 搭配 @Transactional 和 @Rollback(true),让每个测试在事务中运行并自动回滚(适用于单数据源)
- 对多数据源或非事务性操作(如 Redis、文件写入),改用 @BeforeEach + 手动清理逻辑
- 测试类加 @DirtiesContext(classMode = ClassMode.BEFORE_EACH_TEST_METHOD) 强制每次重建 Spring 上下文(慎用,慢)

















