SpringBoot-MyBatis-UnitTesting
# Spring Boot + MyBatis 单元测试专家
## 技能概述
本技能提供Spring Boot + MyBatis + MySQL项目的专业单元测试解决方案,确保:
1. **正常流程全面覆盖** - 所有业务逻辑都有对应的成功测试
2. **异常场景充分测试** - 各种错误情况和异常处理都有测试验证
3. **边界值完整验证** - 数据边界、参数边界、状态边界都有测试
4. **分层测试策略** - Mapper、Service、Controller各层都有专业测试方法
## 快速开始
### 1. Maven依赖配置
查看 [references/dependencies.md](references/dependencies.md) 获取完整的测试依赖配置。
### 2. 测试结构
- **Mapper层**: 使用 `@MybatisTest` + H2内存数据库
- **Service层**: 使用 `@ExtendWith(MockitoExtension.class)` + Mock依赖
- **Controller层**: 使用 `@WebMvcTest` + MockMvc
- **集成测试**: 使用 `@SpringBootTest` + Testcontainers
### 3. 测试覆盖率目标
- Mapper层: 90%+ (覆盖所有SQL语句)
- Service层: 95%+ (覆盖所有业务逻辑分支)
- Controller层: 85%+ (覆盖所有API端点)
- 异常测试: 100% (所有异常处理逻辑)
- 边界测试: 100% (所有边界条件)
## 核心测试策略
### 正常流程测试 (Normal Flow Testing)
每个业务方法都需要以下测试:
- **成功场景测试**: 验证方法在理想条件下的行为
- **多数据测试**: 测试不同数据组合下的表现
- **状态转换测试**: 验证状态机的正确转换
- **并发安全测试**: 确保线程安全(如果适用)
### 异常流程测试 (Exception Flow Testing)
每个可能抛出的异常都需要:
- **参数验证异常**: 测试无效参数的异常处理
- **业务逻辑异常**: 测试业务规则违反的异常
- **数据不存在异常**: 测试查询不到数据的异常
- **并发异常**: 测试并发冲突的异常处理
- **外部依赖异常**: 测试外部服务失败的异常
### 边界值测试 (Boundary Value Testing)
所有输入参数都需要边界测试:
- **数值边界**: 最小/最大/临界值测试
- **字符串边界**: 空/null/最大长度/特殊字符测试
- **集合边界**: 空集合/单元素/最大容量测试
- **时间边界**: 最小/最大时间/时区边界测试
- **状态边界**: 初始/中间/最终状态测试
## 测试模板
### Mapper层测试模板
```java
// 查看完整模板: references/mapper-test-template.java
@MybatisTest
@AutoConfigureTestDatabase(replace = Replace.NONE)
@Sql("/test-data.sql")
class [Entity]MapperTest {
// CRUD操作测试
// 复杂查询测试
// 事务边界测试
// 性能边界测试
}
```
### Service层测试模板
```java
// 查看完整模板: references/service-test-template.java
@ExtendWith(MockitoExtension.class)
class [Entity]ServiceTest {
// 业务逻辑测试
// 异常处理测试
// 事务管理测试
// 并发安全测试
}
```
### Controller层测试模板
```java
// 查看完整模板: references/controller-test-template.java
@WebMvcTest([Entity]Controller.class)
class [Entity]ControllerTest {
// HTTP方法测试
// 请求参数测试
// 响应格式测试
// 错误处理测试
}
```
### 集成测试模板
```java
// 查看完整模板: references/integration-test-template.java
@SpringBootTest
@AutoConfigureMockMvc
@Transactional
class [Feature]IntegrationTest {
// 端到端流程测试
// 数据一致性测试
// 性能基准测试
// 安全边界测试
}
```
## 测试数据管理
### 测试数据策略
1. **静态测试数据**: 使用 `@Sql` 注解导入SQL文件
2. **动态测试数据**: 使用Builder模式创建测试对象
3. **随机测试数据**: 使用Faker库生成随机数据
4. **边界测试数据**: 专门测试边界条件的数据
### 测试数据工厂
查看 [references/test-data-factory.java](references/test-data-factory.java) 获取测试数据工厂实现。
### SQL测试数据文件
查看 [references/test-data-examples.sql](references/test-data-examples.sql) 获取测试SQL示例。
## 特殊场景测试
### 1. 事务测试
```java
@Test
@Transactional(propagation = Propagation.NEVER)
void testTransactionRollback() {
// 测试事务回滚
}
@Test
void testTransactionPropagation() {
// 测试事务传播
}
```
### 2. 并发测试
```java
@Test
void testConcurrentAccess() throws InterruptedException {
// 使用CountDownLatch或CompletableFuture测试并发
}
```
### 3. 性能测试
```java
@Test
@Timeout(5) // 5秒超时
void testPerformanceBoundary() {
// 性能边界测试
}
```
### 4. 安全测试
```java
@Test
void testSecurityConstraints() {
// 权限验证测试
// 数据隔离测试
}
```
## 测试工具和最佳实践
### 断言选择指南
- **基本断言**: 使用JUnit 5的 `assertEquals()`、`assertThrows()`
- **流式断言**: 使用AssertJ的 `assertThat()` 链式调用
- **匹配器断言**: 使用Hamcrest的 `assertThat()` + Matcher
- **自定义断言**: 创建领域特定的断言方法
### Mock使用指南
- **最小化Mock**: 只Mock外部依赖
- **验证调用**: 使用 `verify()` 验证方法调用
- **参数匹配**: 使用 `any()`, `eq()`, `argThat()` 等
- **异常模拟**: 使用 `when().thenThrow()` 模拟异常
### 测试生命周期
- **@BeforeEach**: 准备测试数据
- **@AfterEach**: 清理测试数据
- **@BeforeAll**: 初始化测试环境
- **@AfterAll**: 清理测试环境
## 质量保证
### 代码覆盖率检查
```bash
# 生成覆盖率报告
mvn clean test jacoco:report
# 检查覆盖率阈值
mvn jacoco:check
```
### 测试代码质量
- **可读性**: 测试代码应该像文档一样清晰
- **可维护性**: 避免重复代码,使用工厂模式
- **可执行性**: 测试应该快速执行,独立运行
- **可调试性**: 提供清晰的失败信息
### 测试命名规范
- **方法名**: `test[场景]_[条件]_[期望结果]`
- **测试类**: `[Entity][Layer]Test`
- **数据工厂**: `TestDataFactory`
- **测试文件**: `test-[feature].sql`
## 故障排除
### 常见问题
1. **事务不回滚**: 检查 `@Transactional` 注解位置
2. **Mock不生效**: 检查 `@MockBean` 和 `@Mock` 的区别
3. **数据库连接失败**: 检查H2数据库配置
4. **测试数据污染**: 使用 `@Transactional` 或清理方法
### 调试技巧
- 启用详细日志: `logging.level.root=DEBUG`
- 使用 `@DirtiesContext` 重置Spring上下文
- 使用 `@TestPropertySource` 覆盖配置
- 使用 `MockMvc` 的 `andDo(print())` 打印请求详情
## 扩展和定制
### 自定义测试注解
```java
// 创建组合注解简化测试配置
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@MybatisTest
@AutoConfigureTestDatabase
@Sql("/test-data.sql")
public @interface MybatisIntegrationTest {
}
```
### 测试工具扩展
- **自定义Matcher**: 创建领域特定的Matcher
- **测试监听器**: 实现TestExecutionListener
- **自定义Runner**: 扩展SpringJUnit4ClassRunner
- **测试扩展**: 实现Extension接口
### 性能优化
- **测试分组**: 使用 `@Tag` 分组测试
- **并行执行**: 配置Maven Surefire并行执行
- **数据库优化**: 使用H2内存数据库模式
- **Mock优化**: 避免不必要的Mock初始化
## 参考资源
### 核心文档
- [测试依赖配置](references/dependencies.md) - Maven依赖和配置
- [测试模板代码](references/) - 各层测试模板
- [测试数据示例](references/test-data-examples.sql) - SQL测试数据
- [测试工厂模式](references/test-data-factory.java) - 数据工厂实现
### 最佳实践
- [测试策略指南](references/testing-strategies.md) - 详细测试策略
- [异常测试模式](references/exception-patterns.md) - 异常测试模式
- [边界测试方法](references/boundary-testing.md) - 边界测试方法
- [性能测试指南](references/performance-testing.md) - 性能测试指南
### 工具脚本
- [测试覆盖率脚本](scripts/check-coverage.sh) - 检查覆盖率脚本
- [测试数据生成器](scripts/generate-test-data.py) - 生成测试数据
- [测试报告生成器](scripts/generate-test-report.py) - 生成测试报告
## 使用示例
当用户请求"为我的Spring Boot项目编写单元测试"时:
1. **分析项目结构** - 识别Entity、Mapper、Service、Controller
2. **选择测试策略** - 根据需求选择正常/异常/边界测试
3. **生成测试代码** - 使用模板生成对应层的测试
4. **配置测试环境** - 设置依赖、数据、配置
5. **验证测试覆盖** - 检查覆盖率,补充缺失测试
本技能确保为每个Spring Boot项目提供专业、全面、可维护的单元测试解决方案。
---
## 📦 发布信息
### ClawHub发布配置
此Skill已配置为可发布到ClawHub的技能市场。包含以下发布文件:
1. **clawhub.yml** - 发布配置文件
2. **package.json** - 标准化包描述
3. **LICENSE** - MIT许可证
4. **README.md** - 完整使用说明
### 发布准备检查清单
✅ **完整性检查**
- [x] SKILL.md - 主技能文件
- [x] README.md - 使用文档
- [x] scripts/ - 3个实用脚本
- [x] references/ - 4个参考文档
- [x] examples/ - 2个示例测试代码
- [x] assets/ - 资源文件夹
✅ **配置检查**
- [x] clawhub.yml - 发布配置
- [x] package.json - 包管理
- [x] LICENSE - 许可证文件
✅ **质量检查**
- [x] 测试策略文档齐全
- [x] 代码示例完整可运行
- [x] 工具脚本可用
- [x] 依赖配置正确
### 发布到ClawHub的步骤
1. **创建GitHub仓库**(推荐)
```bash
git init
git add .
git commit -m "feat: Spring Boot单元测试Skill v1.0.0"
git remote add origin https://github.com/your-repo/springboot-unit-testing.git
git push -u origin main
```
2. **准备发布包**
```bash
# 打包Skill
tar -czf springboot-unit-testing-skill-v1.0.0.tar.gz test-skill/
# 或使用zip
zip -r springboot-unit-testing-skill-v1.0.0.zip test-skill/
```
3. **发布到ClawHub**
- 访问ClawHub网站 (https://clawhub.com)
- 注册/登录开发者账户
- 创建新Skill发布
- 填写Skill信息(参考clawhub.yml)
- 上传打包文件
- 设置分类标签:spring-boot, testing, java
- 提交审核
4. **维护和更新**
- 定期更新测试策略
- 收集用户反馈
- 发布新版本
- 更新文档
### Skill分类信息
- **类别**: 开发工具 / 测试框架
- **技术栈**: Spring Boot, MyBatis, MySQL, JUnit 5
- **适用场景**: 企业级Java项目单元测试
- **难度级别**: 中级(需要Java和Spring Boot基础)
- **预估时间**: 使用此Skill可减少50%的测试开发时间
### 用户支持
- **文档**: 完整的README和示例代码
- **问题反馈**: 通过GitHub Issues
- **社区**: 分享测试经验和最佳实践
- **贡献**: 欢迎提交PR改进Skill
### 版本历史
- **v1.0.0** (2026-03-20) - 初始发布
- 完整的Spring Boot单元测试策略
- 正常流程、异常测试、边界值测试全面覆盖
- 3个实用工具脚本
- 4个详细参考文档
- 2个完整代码示例
---
**让Spring Boot项目的单元测试更专业、更全面、更高效!**
标签
skill
ai