一、Mock概念与价值
我个人习惯把Mock比作“替身演员”。你想想看,拍动作戏时,主角不可能真去跳楼对吧?前台服务也一样。你开发的前台服务需要依赖一堆后端接口、数据库、第三方SDK,但这些依赖要么没写好,要么不稳定,要么根本搭不起来。这时候,Mock就登场了。
说白了,Mock就是模拟真实依赖的替身。它让你在前台服务还没连上真实环境时,就能把代码跑起来、把流程测通。我第一次尝到Mock的甜头,是在一个直播项目里。当时要验证礼物弹窗和连麦信令的交互时序,但后端接口还在联调。如果没有Mock,我只能干等,项目铁定延期。
1.1 什么是Mock
Mock,全称“Mock Object”。它不是一个库,也不是一个工具,而是一种测试替身的思想。它的核心就三件事:
- 模拟行为:让一个假的接口返回你想要的固定数据。
- 记录交互:记录你的代码是否真的调用了这个接口,传入了什么参数。
- 验证结果:断言你的代码在特定输入下,是否产生了预期的输出。
你可以在单元测试、集成测试,甚至开发联调阶段使用它。对我而言,Mock最大的价值是:让你的代码和依赖解耦。
1.2 Mock在前台服务中的作用
前台服务,比如登录、支付、位置定位、推送通知,最怕什么?最怕“环境不稳定”。后端挂了,你的前台逻辑就测不了?不,有了Mock,你可以继续测。
| 作用 | 具体说明 |
|---|---|
| 隔离依赖 | 屏蔽后端、数据库、第三方SDK的不可用或异常抖动 |
| 加速开发 | 后端接口还没写好,前端就可以先跑起来 |
| 模拟异常场景 | 网络超时、401鉴权失败、返回空数据等等 |
| 提升测试稳定性 | 不依赖外部环境,测试结果可重复 |
我参与过一个地图导航项目,需要测试“定位权限被拒绝”的弹窗逻辑。真实环境下,你总不能每次测试都去设置里关掉权限吧?用Mock一行代码就能模拟“拒绝定位”的回调。嗯,这就是Mock的实用之处。
1.3 Mock vs Stub:别再搞混了
很多新人问我:“Mock和Stub到底有什么区别?” 其实我在刚入行时也分不清。我记得有一次评审会上,因为用错术语,被架构师纠正了半天。后来我总结了一个看法:
- Stub:是个哑巴演员。你告诉它“返回100”,它就返回100。它不会管你有没有调用它,也不关心你调了几次。
- Mock:是个监工演员。它不仅返回固定数据,还会偷偷记录“你的代码有没有调过这个方法?调了几次?传了什么参数?”
换句话说:Stub负责状态验证,Mock负责行为验证。
| 对比维度 | Stub | Mock |
|---|---|---|
| 核心目的 | 提供测试所需的返回值 | 验证对象之间的交互 |
| 是否记录调用 | 不记录 | 记录调用次数、参数等 |
| 典型场景 | 数据查询、接口回调 | 事件上报、权限请求结果 |
| 测试的重点 | 状态(返回值) | 行为(交互过程) |
1.4 Mock回放的核心价值
讲完Mock,咱们再聊聊回放。什么叫回放?就是把一次真实的服务器交互(比如HTTP请求)录下来,下次测试时直接重播这份数据,而不是真的请求服务器。
为什么需要回放?因为你没法保证每次请求都一定成功。比如:
- 后端正在发版,接口不可用
- 网络环境波动,请求超时
- 数据被其他测试用例污染了
Mock回放的核心价值就在于:可复现、可追踪、可离线。
我个人的习惯是:用Mock回放来替代真实的网络请求。你想想看,前端服务的回归测试经常要跑几百遍接口。如果每次都调用真实后端,不仅慢,而且容易因为后端数据变掉而导致用例失败。但用了Mock回放,你的测试用例就变成了“白盒”——你知道每次返回的数据是什么,你也知道每个分支代码是否能走到。
下面这张图展示了Mock回放在前台服务测试中的核心位置:
理解了上面这张图,你就知道咱们这门课要讲什么了。不过我得强调一句:Mock回放不是Mock的全部。它更像是Mock在集成测试和回归测试场景下的一个高效应用。你可以在单元测试用Mock框架(比如Mockito),在集成测试用Mock回放工具(比如录制/回放代理),两者并不冲突。