Mockito Made Clear: Java Unit Testing with Mocks, Stubs, and Spies
作者: Ken Kousen
语言: 英文
出版年份: 2023
编程语言: Java
下载链接:
书籍均收集自互联网,仅供学习和研究使用,请莫用于商业用途。谢谢合作。

书籍摘要

一、定位与价值

  • 目标读者:已掌握 JUnit,却在“依赖地狱”中挣扎的 Java 开发者
  • 核心命题:用 Mockito 生成“可控的假对象”,把单元测试从“集成泥潭”中解救出来
  • 阅读收益:学会识别何时该用 mock / stub / spy,写出可维护、可演进、可定位失败的测试

二、内容架构速览

章节 关键词 一句话提炼
Ch1 测试地基 依赖倒置、假对象、集成→单元 先让代码可测,再谈 Mockito 魔法
Ch2 API 速通 @Mock、@InjectMocks、when/then、verify 5 步套路:创建-预期-注入-执行-验证
Ch3 参数匹配 any*()、eq()、argThat、intThat、InOrder 用“模糊匹配”替代硬编码,让测试更通用
Ch4 高阶场景 void 方法、BDD、ArgumentCaptor、Answer、Spy 无返回值、动态返回值、捕获实参、部分打桩一次搞定
Ch5 特殊武器 final、static、构造器、Spring @MockBean 告别“无法继承”“无法注入”等历史包袱
附录 JUnit4/5 配置、Gradle/Maven 坐标 复制即可跑通

三、关键概念“三张表”

1. 替身家族

术语 本质 用途 是否记录交互
Stub 存根 假实现 提供固定返回值 ×
Mock 模拟 Stub + 记录 验证调用次数/顺序
Spy 间谍 包装真对象 部分打桩 + 监听

2. 典型工作流程

  1. 识别被测类的唯一职责
  2. 列出外部依赖(数据库、HTTP、消息队列…)
  3. 用 Mockito 生成“可控替身”
  4. 设定输入→输出的“剧本”
  5. 执行被测方法
  6. 断言返回值 + 验证交互协议(次数、顺序、参数)

3. 常见误区与官方忠告

  • ❌ 为了覆盖率而滥用 mock → 测试臃肿、重构即崩
  • ❌ mock 自己未拥有的类(如 JDK、第三方库)→ 升级即失效
  • ✅ 优先面向接口、减少依赖;不得己时再 mock 具体类
  • ✅ 集成测试与单元测试并存:前者保“通路”,后者保“逻辑”

四、亮点技巧 Top10

  1. 静态导入 Mockito.*,代码量减半
  2. when/thenReturn 链式写法,一次返回多值:
    when(dao.findById(anyInt())).thenReturn(p1, p2, p3);
  3. 无返回值方法:doThrow().when(x).send() 避免编译错误
  4. BDD 风格:given(x).willReturn() + then(x).should(),产品经理也读得懂
  5. 参数捕获:@Captor ArgumentCaptor<Person> captor; 精准校验内部构造的对象
  6. 动态答案:thenAnswer(inv -> inv.getArgument(0) + "OK") 让输出依赖输入
  7. 顺序验证:InOrder inOrder = inOrder(mockA, mockB); 跨多对象校验时序
  8. 终局检查:verifyNoMoreInteractions(mock) 防止“意外调用”
  9. 特殊类:mockito-inline 一键开启 final、static、构造器打桩
  10. Spring Boot:直接 @MockBean 替换上下文,自动注入到被测 Service

五、案例速读

  • “太空宇航员”项目

    • AstroGateway 调开放 API → 返回 JSON
    • AstroService 统计各飞船人数 → Map<String, Long>
    • 作者示范“集成测试→单元测试”拆分:
      1. 集成用真 Gateway,验证端到端;
      2. 单元用 mock Gateway,验证统计逻辑。
  • Publisher-Subscriber
    send() 方法返回 void,传统测试无从下手;用 mock Subscriber 验证 receive() 调用次数与顺序,展示“无返回值也能测”。

  • Wiki 生物抓取
    依赖 WikiUtil.staticGetExtract(),用 MockedStatic<WikiUtil> 在 try-with-resources 块内完成静态打桩,兼顾性能与隔离。


六、版本与生态

  • 书籍代码基于 Mockito 4.x(兼容 Java 8+)
  • Mockito 5 已把 inline mock maker 并入 core,final、static mocking 零配置
  • 与 JUnit5、AssertJ、Spring Boot 无缝整合;示例同时给出 Gradle/Maven 坐标,开箱即用

七、一句话收束

> 如果你曾因“外部依赖不可测”而放弃单元测试,《Mockito Made Clear》 提供了一条“先替身、后重构、再回归”的清晰路径:
> 让测试像呼吸一样自然,让重构像散步一样安全。

期待您的支持
捐助本站