1. Mock 回放基础:从概念到实战

我记得第一次接触 Mock 这个词,是在 2014 年做一个大改版项目的时候。
联调环境死活连不上,后端说要等三天才能部署测试。
当时团队里一位老大哥丢过来一句话:“你先把接口 Mock 掉,别等着。”
就这么一句话,开启了我跟 Mock 的十年缘分。

1.1 到底什么是 Mock?

Mock 这个概念,说白了就是“造一个假货,以假乱真”。

在 Android 开发里,当我们依赖的服务、设备、数据源还没准备好,或者不稳定时,我们会先造一个“替身”出来。
这个替身能返回我们想要的数据,也能模拟各种极端情况——超时、报错、空数据。

举个例子:

// 真实接口,需要后端配合
interface UserApi {
    @GET("user/info")
    suspend fun getUserInfo(): UserInfo
}

// Mock 替身,完全本地自己编数据
class MockUserApi : UserApi {
    override suspend fun getUserInfo(): UserInfo {
        return UserInfo(
            id = 10086,
            name = "测试用户",
            avatar = "https://mock.avatar/1.png"
        )
    }
}

你想想看,这段代码在真实联调时可以直接替换成 Mock 实现,
不用等后端、不用配 Wi-Fi、甚至飞机上都可以跑完整流程。
这就是 Mock 最朴素的用途——解耦依赖,让你专注于自己的代码逻辑。

我个人的习惯: 在项目初期就写好 Mock 实现,哪怕只有一个简单的 `return null`。
因为等我把所有业务逻辑写完,再回头补 Mock,往往会遗漏很多边界情况。

1.2 回放又是什么?

Mock 解决了“能不能跑”的问题,但离“跑得对不对”还有段距离。
你想想看:你造了一个 Mock 接口,每次返回都一样的数据。
那遇到线上 bug 怎么办?某个接口突然返回了错误码,你本地能复现吗?

这时候就需要 回放(Replay) 了。

回放的思路很简单:
把线上真实流量里的请求-响应记录下来,存成一个文件(我们叫它 Mock 文件 或 回放数据包)。
然后在本地开发或测试时,用这个文件代替真实的网络请求。
这样你测试的数据就是真实的线上数据,而不是你自己拍脑袋编的。

核心区别一句话:

  • Mock 是我主动造数据,用于功能性开发和基本测试。
  • 回放是我录下线上数据,用于复现问题和验证修复。

举个例子:用户反馈某个页面闪退,你查日志发现是某个字段为空。
但本地 Mock 那个字段一直有值,你复现不了。
这时你把线上那个请求录下来,直接回放,bug 瞬间复现。
—— 这种做法,我在好几个项目里救过急。

1.3 核心概念梳理

为了方便后续深入,我们先统一三个基本概念:

概念 描述 类比
Mock 数据 开发者手动构造的假数据,通常写在代码里或 json 文件里 拍电影用的道具手机
回放数据 从线上真实流量录制下来的请求-响应记录 行车记录仪回放
Mock 引擎 负责拦截网络请求并替换为本地数据的中间层(如 MockWebServer、MockK) 检测站里的信号模拟器
我曾经踩过一个坑: 把线上录制的敏感数据直接提交到了 Git 仓库,差点出事。
后来我规定:所有回放数据只能本地使用,禁止上传到公共仓库。
如果要共享,必须先脱敏处理,比如替换用户 ID、手机号等。

1.4 应用场景

以下是我在多个项目中总结出的三个最实用的场景:

  1. 独立开发阶段: 后端接口还没写好,或者部署环境不稳定。
    先用 Mock 数据跑通 UI 和业务逻辑,不依赖任何外部服务。
  2. Bug 复现: 线上出现偶发 bug,日志不完整。
    把当时的请求录下来,在本地回放,用 Debugger 一步步看数据流。
  3. 自动化测试: 单元测试和 UI 测试中,需要可重复、可预测的输入数据。
    回放数据能保证每次运行结果一致,避免环境差异导致的误报。

举个例子,我最近参与的支付流程重构项目:
支付回调的订单状态有十几种,如果手写 Mock 数据,要写十几个 if-else。
而我们直接录了线上 2000 笔真实订单的回调,做成回放数据包,
一行代码就覆盖了所有分支,还发现了一个文档里没写到的“订单取消中”状态。

1.5 知识体系总览

讲到这里,我把本章的知识结构画成一张图,方便你整体把握:

Mock 回放基础 - 核心知识体系 Mock(模拟) 回放(Replay) Mock 引擎 手动构造数据 线上录制流量 本地替换请求 数据持久化 独立开发 Bug 复现 自动化测试 性能压测 关键思维: Mock 让你能跑起来,回放让你能跑得准。 二者结合,才能形成完整的测试闭环。

1.6 为什么我说 Mock 回放值得系统学习?

我做过的项目里,超过一半的线上 bug 是因为数据跟本地 Mock 对不上导致的。
比如本地 Mock 永远返回 200,线上突然返回 502,你的错误处理分支根本没测试过。
—— 这都是血淋淋的教训。

而回放正好解决了这个问题:
它让你可以用真实态数据测试,又不需要真的连着线上环境。

你想想看,如果你能把线上某次崩溃的请求原样回放到本地,
结合 Android Studio 的 Debugger,一行一行看数据怎么被处理的……
那种“破案”的快感,是纯 Mock 永远给不了的。

本章小结:

  • Mock = 手动造数据,用于功能开发和基础验证。
  • 回放 = 录线上数据,用于复现和精准测试。
  • 核心概念:Mock 数据、回放数据、Mock 引擎。
  • 三大场景:独立开发、Bug 复现、自动化测试。

下一章节开始前, 建议你先在本地建一个简单的 Mock 项目,
哪怕只 Mock 一个接口也好,先感受下“不依赖后端”的开发体验。