一、Mock概念与价值

我个人习惯把Mock比作“替身演员”。你想想看,拍动作戏时,主角不可能真去跳楼对吧?前台服务也一样。你开发的前台服务需要依赖一堆后端接口、数据库、第三方SDK,但这些依赖要么没写好,要么不稳定,要么根本搭不起来。这时候,Mock就登场了。

说白了,Mock就是模拟真实依赖的替身。它让你在前台服务还没连上真实环境时,就能把代码跑起来、把流程测通。我第一次尝到Mock的甜头,是在一个直播项目里。当时要验证礼物弹窗和连麦信令的交互时序,但后端接口还在联调。如果没有Mock,我只能干等,项目铁定延期。

1.1 什么是Mock

Mock,全称“Mock Object”。它不是一个库,也不是一个工具,而是一种测试替身的思想。它的核心就三件事:

  • 模拟行为:让一个假的接口返回你想要的固定数据。
  • 记录交互:记录你的代码是否真的调用了这个接口,传入了什么参数。
  • 验证结果:断言你的代码在特定输入下,是否产生了预期的输出。

你可以在单元测试、集成测试,甚至开发联调阶段使用它。对我而言,Mock最大的价值是:让你的代码和依赖解耦。

📌 一个小提示:刚开始接触Mock时,别想着把整个项目都Mock掉。只Mock你当前代码直接依赖的外部接口,就够了。

1.2 Mock在前台服务中的作用

前台服务,比如登录、支付、位置定位、推送通知,最怕什么?最怕“环境不稳定”。后端挂了,你的前台逻辑就测不了?不,有了Mock,你可以继续测。

作用 具体说明
隔离依赖 屏蔽后端、数据库、第三方SDK的不可用或异常抖动
加速开发 后端接口还没写好,前端就可以先跑起来
模拟异常场景 网络超时、401鉴权失败、返回空数据等等
提升测试稳定性 不依赖外部环境,测试结果可重复

我参与过一个地图导航项目,需要测试“定位权限被拒绝”的弹窗逻辑。真实环境下,你总不能每次测试都去设置里关掉权限吧?用Mock一行代码就能模拟“拒绝定位”的回调。嗯,这就是Mock的实用之处。

1.3 Mock vs Stub:别再搞混了

很多新人问我:“Mock和Stub到底有什么区别?” 其实我在刚入行时也分不清。我记得有一次评审会上,因为用错术语,被架构师纠正了半天。后来我总结了一个看法:

  • Stub:是个哑巴演员。你告诉它“返回100”,它就返回100。它不会管你有没有调用它,也不关心你调了几次。
  • Mock:是个监工演员。它不仅返回固定数据,还会偷偷记录“你的代码有没有调过这个方法?调了几次?传了什么参数?”

换句话说:Stub负责状态验证,Mock负责行为验证。

对比维度 Stub Mock
核心目的 提供测试所需的返回值 验证对象之间的交互
是否记录调用 不记录 记录调用次数、参数等
典型场景 数据查询、接口回调 事件上报、权限请求结果
测试的重点 状态(返回值) 行为(交互过程)
⚠️ 避坑指南:我曾经在一个项目里把Stub当Mock用,结果代码覆盖率达到90%,但核心的“点击事件上报”逻辑漏测了。因为Stub不会告诉你“这个上报方法没被调用”。所以,测状态用Stub,测交互用Mock,千万别混用。

1.4 Mock回放的核心价值

讲完Mock,咱们再聊聊回放。什么叫回放?就是把一次真实的服务器交互(比如HTTP请求)录下来,下次测试时直接重播这份数据,而不是真的请求服务器。

为什么需要回放?因为你没法保证每次请求都一定成功。比如:

  • 后端正在发版,接口不可用
  • 网络环境波动,请求超时
  • 数据被其他测试用例污染了

Mock回放的核心价值就在于:可复现、可追踪、可离线。

我个人的习惯是:用Mock回放来替代真实的网络请求。你想想看,前端服务的回归测试经常要跑几百遍接口。如果每次都调用真实后端,不仅慢,而且容易因为后端数据变掉而导致用例失败。但用了Mock回放,你的测试用例就变成了“白盒”——你知道每次返回的数据是什么,你也知道每个分支代码是否能走到。

下面这张图展示了Mock回放在前台服务测试中的核心位置:

Mock 核心概念与价值结构图 Mock(替身演员) 前台服务的作用 Mock vs Stub 区别 Mock回放的核心价值 隔离依赖 加速开发 模拟异常 Stub(状态验证) Mock(行为验证) 可复现 可离线 可追踪 💡 Mock回放 = 把真实服务交互录下来, 作为离线测试数据源,保证每次测试结果一致。

理解了上面这张图,你就知道咱们这门课要讲什么了。不过我得强调一句:Mock回放不是Mock的全部。它更像是Mock在集成测试和回归测试场景下的一个高效应用。你可以在单元测试用Mock框架(比如Mockito),在集成测试用Mock回放工具(比如录制/回放代理),两者并不冲突。

🎯 一句话总结本章:Mock给你的前台服务一个“隔离环境”,Stub只管给数据,Mock还管“有没有被调用”;而Mock回放,则是把这一切固化下来,让测试真正脱离环境依赖。