Mockito从入门到精通教程大纲(基于JUnit 5)
第一章:环境准备与基础概念
-
单元测试核心原则
- 测试金字塔(单元/集成/端到端测试)
- 为什么需要Mock?依赖隔离的重要性
-
环境搭建
- JUnit 5 + Mockito 5 依赖配置(Maven/Gradle)
- 验证环境:第一个Mock测试案例
java@Test void firstMockTest() { List<?> mockList = mock(List.class); when(mockList.size()).thenReturn(100); assertEquals(100, mockList.size()); }
第二章:Mockito核心API
- 创建Mock对象
mock()
方法 vs@Mock
注解- 启用注解:
@ExtendWith(MockitoExtension.class)
- 方法桩(Stubbing)
when().thenReturn()
基础返回值thenThrow()
,thenAnswer()
,thenCallRealMethod()
- 连续配置:
thenReturn(val1, val2, val3)
- 行为验证
verify()
基础调用验证- 调用次数:
times()
,atLeastOnce()
,atMost(3)
- 超时验证:
verify(mock, timeout(200)).method()
第三章:JUnit 5深度整合
- 注解驱动开发
@Mock
+@InjectMocks
自动依赖注入- 构造函数注入 vs Setter注入的Mock策略
- 参数化测试
@ParameterizedTest
结合Mock对象@CsvSource
提供多组测试数据
- 断言增强
- AssertJ与Mockito联合使用
- 流式断言:
assertThat(mock).hasSize(2).contains("test")
第四章:高级Mock技巧
- 参数匹配器(Argument Matchers)
- 模糊匹配:
any()
,eq()
,isNull()
- 自定义匹配器:
argThat(condition)
- 模糊匹配:
- Spy对象:部分真实的对象
@Spy
注解的使用场景- 保留真实逻辑:
doReturn().when(spy).method()
- 静态方法/构造函数Mock
- Mockito的限制说明
- 扩展方案:Mockito-Inline(有限支持静态方法)
- BDD风格测试
- Given-When-Then模式
BDDMockito.given()
替代传统when()
第五章:复杂场景实战
- 异步代码测试
verify()
+timeout()
验证异步调用- 使用
Awaitility
库增强异步断言
- Spring Boot整合测试
@MockBean
替换Spring容器中的Bean@WebMvcTest
隔离Controller层测试
- 数据库操作模拟
- 模拟JPA Repository的
save()
,findById()
- 事务回滚测试策略
- 模拟JPA Repository的
- 微服务间调用验证
- 模拟FeignClient/RestTemplate的HTTP请求
- 异常重试逻辑测试
第六章:测试优化与调试
-
严格Stubbing模式
Mockito.lenient()
控制冗余桩检测- 避免"不必要的Stubbing"错误
-
参数捕获与分析
ArgumentCaptor
捕获方法参数- 多层嵌套对象验证技巧
-
测试覆盖率提升
- JaCoCo配置与报告解读
- 边界条件/异常分支覆盖策略
-
测试日志与诊断
Mockito.mockingDetails()
获取Mock状态- 使用
log()
方法输出调用信息
javaverify(mock, times(1)).method(any(), log());
第七章:企业级最佳实践
- 测试代码规范
- 测试类命名规则(*Test vs *Tests)
- 测试方法命名模式(shouldXXX_whenYYY)
- 测试代码重构
- 提取公共测试配置(@BeforeEach)
- 自定义注解简化重复代码
- 持续集成中的测试策略
- 分层测试执行(单元/集成测试分离)
- 测试性能优化(并行执行/资源复用)
- 常见反模式
- 过度Mock导致测试失真
- 忽略验证导致虚假通过
第八章:综合实战项目
- 电商订单系统测试
- 模拟支付服务(PaymentService)
- 库存服务(InventoryService)异常处理测试
- 分布式锁实现验证
- 模拟Redis客户端操作
- 并发场景下的锁竞争测试
- 消息队列消费逻辑测试
- 模拟RabbitMQ/Kafka消息消费
- 幂等性处理与重试机制验证
附录:扩展资源
- 官方文档导航
- 调试工具推荐
- IDEA调试技巧:追踪Mock调用栈
- Chrome开发者工具远程调试测试
- 进阶学习路径
- 源码阅读:Mockito核心实现原理
- 扩展框架:PowerMock vs Mockito-Inline
学习路线建议
- 新手阶段(1-2周)
- 掌握1-3章核心API
- 完成官方QuickStart案例
- 进阶阶段(2-4周)
- 实现第5章复杂场景测试
- 参与开源项目测试代码阅读
- 精通阶段(1-2月)
- 设计企业级测试规范
- 贡献Mockito社区Issue/PR
本大纲覆盖从基础到架构级的Mockito应用,结合JUnit5新特性设计现代Java测试方案。建议配合实际项目迭代学习,每章节配套代码示例可在Github仓库获取。