Spring Boot单元测试核心是用@SpringBootTest启动轻量上下文,配合@MockBean隔离依赖,通过MockMvc验证Web层;聚焦业务逻辑、服务交互与边界场景,优先使用纯JUnit5测试纯逻辑,@Transactional确保数据库自动回滚。

Spring Boot 单元测试的核心是用 @SpringBootTest 启动轻量上下文,配合 @MockBean 隔离外部依赖,再通过 TestRestTemplate 或 MockMvc 验证 Web 层行为。重点不是“测所有”,而是聚焦业务逻辑、服务交互和关键边界。
用 @SpringBootTest 启动最小化上下文
避免全量启动(默认会加载全部配置),加 classes 指定需加载的配置类或组件,加快测试速度:
@SpringBootTest(classes = {OrderService.class, OrderRepository.class})
class OrderServiceTest { ... }
若只验证纯业务逻辑(无 Spring 容器参与),优先用普通 JUnit5 + @ExtendWith(MockitoExtension.class),更轻更快。
用 @MockBean 替换真实 Bean,控制依赖行为
它会在 Spring 上下文中替换同类型 Bean,常用于屏蔽数据库、远程调用等不稳定的外部依赖:
立即学习“Java免费学习笔记(深入)”;
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 模拟成功场景:
@MockBean private PaymentClient paymentClient;,再用when(paymentClient.pay(any())).thenReturn(true); - 模拟异常场景:
when(orderRepository.findById(1L)).thenThrow(new EntityNotFoundException("Not found")); - 注意:不要对
@MockBean对象手动 new 实例,否则注入失效
用 MockMvc 测试 Controller 层(推荐)
比 TestRestTemplate 更细粒度,可验证状态码、响应体、Header、JSON 结构,且不走网络:
@Autowired
private MockMvc mockMvc;
@Test
void shouldReturnOrderWhenIdExists() throws Exception {
mockMvc.perform(get("/api/orders/1")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("$.id").value(1))
.andExpect(jsonPath("$.status").value("PAID"));
}
搭配 @AutoConfigureMockMvc 使用,无需额外配置。
验证核心业务逻辑时,关注输入、状态变更与副作用
比如一个“创建订单并扣减库存”方法,测试应覆盖:
- 正常流程:订单是否创建成功、库存是否减少、是否触发消息发送
- 并发冲突:两个线程同时下单同一商品,是否只有一次扣减(可用
CountDownLatch模拟) - 事务边界:当库存不足时,订单是否回滚、数据库是否无残留数据
- 空值/非法参数:传 null 用户 ID 是否抛出
IllegalArgumentException
用 @Transactional 注解测试类可自动回滚,避免污染测试库;但注意它不回滚非事务性操作(如 Redis 写入、文件写入)。
不复杂但容易忽略:每个测试方法应单一职责、可重复执行、不依赖执行顺序。用 @DisplayName 写清楚意图,比 testCreateOrderSuccess 更易懂。

















