Spring Boot TDD Workflow 是一套针对 Spring Boot 服务的测试驱动开发指导,强调单元测试与集成测试合计达到 80% 以上的覆盖率。
适用场景
- 新增功能或接口
- 修复缺陷或重构代码
- 添加数据访问逻辑或安全规则
工作流
- 先编写测试(此时测试应当失败)
- 实现最小代码使测试通过
- 在测试保持绿色的前提下重构
- 通过 JaCoCo 强制检查覆盖率
单元测试(JUnit 5 + Mockito)
使用 @ExtendWith(MockitoExtension.class),通过 @Mock 注入依赖、@InjectMocks 注入被测服务。示例中 MarketServiceTest 对 MarketRepository 进行打桩,验证 service.create(req) 返回结果的 name 字段,并 verify 仓储的 save 调用。
模式要点:
- 采用 Arrange-Act-Assert 结构
- 避免部分 mock,优先使用显式打桩
- 使用 @ParameterizedTest 覆盖多种变体
Web 层测试(MockMvc)
使用 @WebMvcTest(MarketController.class),自动注入 MockMvc,并用 @MockBean 替换 MarketService。示例对 GET /api/markets 断言状态码为 200,且 JSON 中 $.content 为数组。
集成测试(SpringBootTest)
使用 @SpringBootTest、@AutoConfigureMockMvc 与 @ActiveProfiles("test")。示例向 POST /api/markets 发送 JSON 请求体,断言返回状态为 201 Created。
持久层测试(DataJpaTest)
使用 @DataJpaTest,配合 @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) 与 @Import(TestContainersConfig.class)。示例保存 MarketEntity 后通过 findByName 查询并断言存在。
Testcontainers
建议为 Postgres/Redis 使用可复用容器以贴近生产环境,并通过 @DynamicPropertySource 将 JDBC URL 注入 Spring 上下文。
覆盖率(JaCoCo)
Maven 配置示例使用 org.jacoco:jacoco-maven-plugin:0.8.14,包含 prepare-agent 目标,以及在 verify 阶段执行 report 目标。
断言
- 优先使用 AssertJ 的 assertThat 以提升可读性
- 对 JSON 响应使用 jsonPath
- 对异常使用 assertThatThrownBy(...)
测试数据构建器
示例 MarketBuilder 提供默认 name 为 "Test",通过 withName 链式设置,build() 返回 Market 对象。
CI 命令
- Maven:mvn -T 4 test 或 mvn verify
- Gradle:./gradlew test jacocoTestReport
原则
保持测试快速、隔离且确定;测试行为而非实现细节。
限制
资料未提供该技能的安装方式、平台支持范围、收费或价格信息,也未说明其具体运行环境要求。