Mock 完整详解(结合你的 OMS ↔ WooCommerce 场景,不讲空洞理论)# Mock
全称
Mock Object,中文:模拟对象
日常开发大家直接简称:Mock
补充:
mock 本身是英文单词,本义「模仿、虚假的」;在测试领域专有名词是Mock Object(模拟对象)。
网络上常说的 Mock Server、HTTP Mock 属于衍生用法,根源都是 Mock Object 思想。
标准定义
在软件测试中,Mock Object 是一个用来替代真实外部依赖的伪造对象。
它实现了和真实依赖完全一致的对外接口,程序代码无感知,可以预先设定返回结果、抛出异常,消除对外部真实服务、数据库、第三方API的依赖。
放到你的场景翻译:
真实依赖 = WooCommerce API客户端
Mock对象 = 假的WC客户端,拥有一模一样的方法名,但是不会发起外网HTTP请求。
核心主要作用(结合你的OMS ↔ WooCommerce场景)
解除外部依赖,让测试可以离线运行
CI不需要访问外网buyntryparts.com,不受对方服务器宕机、网络波动、限流影响,测试稳定、速度快。自由构造各种正常/异常场景
线上真实WC很难稳定复现:401鉴权失败、接口超时、返回残缺数据、500错误。
Mock可以一键模拟这些情况,自动化测试你的异常捕获、重试、告警逻辑。隔离被测代码,精准定位Bug
测试只关心【你的OMS代码逻辑】;
如果测试失败,可以确定问题出在你自身代码,而不是第三方WC接口故障。支持并行开发(前后端/服务间)
如果WC接口还在调整,你可以先用Mock数据完成OMS同步逻辑开发,不用等对方接口就绪。避免测试污染线上环境
不再自动化频繁调用生产WC,不会产生测试订单、垃圾数据,保护正式业务,同时不用在CI存放线上密钥。
额外区分容易混淆概念
- Mock Object(代码层面,方案C用的)
面向类/方法,代码内部替换对象,适合单元测试。 - Mock Server(HTTP服务)
启动一个本地Web服务,模拟远端API地址,拦截HTTP请求,适合前端、不方便改后端代码的场景。
极简一句话总结
Mock Object = 和真实依赖拥有相同接口的替身,用来在测试中替代外部服务,摆脱外网依赖,可控构造返回数据。
如果你需要,我可以整理一段可以直接写到技术方案文档里的标准化书面描述。
一、Mock 是什么?
Mock = 模拟替身
当你的程序需要调用外部服务(你这里就是线上 WooCommerce REST API),不发起真实 HTTP 请求,用一段代码假扮成 WooCommerce,按照你预设的规则返回数据、抛出异常。
现实类比:
你(OMS)要打电话给仓库(WooCommerce)同步订单。
- 真实调用:直接拨通仓库电话,真的沟通;
- Mock:找个同事扮演仓库,坐在你旁边,你说什么,他按剧本回复,完全不打外线。
⚠️ 关键区分
本地 OMS 数据库快照 ≠ Mock
本地库解决的是【OMS自身内部数据】;
Mock 解决的是【OMS 和第三方 WC 之间的 HTTP 交互】。
二、你为什么需要 Mock(贴合你的业务)
你的代码流程:OMS业务代码 → WooClient → HTTP请求 → xxx.com
痛点:
- CI跑单测时,一旦走到 WooClient,就依赖外网;网站挂了、网络波动、限流 → 测试随机失败
- 不方便构造异常场景:很难让线上WC临时返回 500、401、空订单、格式错误JSON
- 频繁请求线上站点,有脏数据、风控风险
Mock 之后流程:OMS业务代码 → WooInterface →【二选一】
① Real实现:发真实HTTP(本地调试用)
② Mock实现:直接返回预设JSON(CI自动化测试用)
三、Mock 能做到什么(你的场景实例)
1. 返回正常业务数据
模拟 WC 获取订单接口,直接返回一份录制好的真实响应JSON,不走网络。
OMS拿到数据后,照常执行:字段映射、写入本地OMS库、状态同步。
用来测试:你解析WC返回报文、入库逻辑是否正确。
2. 模拟各种异常(真实线上很难稳定复现)
- 返回 401 密钥失效
- 返回 429 请求限流
- 返回 503 WC服务不可用
- 返回残缺订单(缺少物流字段)
- 模拟请求超时
价值:可以自动化测试你的重试机制、告警、异常捕获代码,线上环境很难稳定复现这些场景。
3. 校验你发出去的请求参数(非常重要!)
Mock 不光负责“返回数据”,还能检查:
OMS推送到WC的订单状态、header、参数格式是否符合WC规范。
例如:你调用更新订单接口时有没有漏传必填字段,Mock可以直接断言报错。
四、两种常见 Mock 实现方式
方式1:代码内Mock(就是选项C说的:抽象接口 + Mock类,推荐长期项目)
先定义统一接口
interfaceWooGatewayInterface{// 拉取WC订单publicfunctiongetOrders(array$params):array;// 推送订单状态到WCpublicfunctionupdateOrder(int$wcOrderId,array$data):array;}1)真实实现(生产/本地调试)
classRealWooGatewayimplementsWooGatewayInterface{publicfunctiongetOrders(array$params):array{// 真实 curl 请求线上WC接口}}2)Mock实现(CI单元测试)
classMockWooGatewayimplementsWooGatewayInterface{// 预设模拟返回数据publicfunctiongetOrders(array$params):array{// 直接返回复刻的WC标准JSON结构,无网络return[['id'=>1001,'status'=>'processing',...]];}}运行时依靠容器切换实例:
CI环境 → MockWooGateway
生产/本地调试 → RealWooGateway
✅ 优点:侵入可控、灵活、支持复杂逻辑、方便断言入参
❌ 代价:需要抽象接口,改动现有代码(也就是选项C提到的改动较大)
方式2:HTTP层Mock(不改动业务代码,适合短期过渡,对应方案A配套手段)
不修改你的 WooClient,拦截内部request()HTTP调用。
PHPUnit 等测试框架可以劫持http客户端,当代码尝试请求xxx.com/wp-json/wc/v3/orders,直接拦截,返回模拟响应。
优点:不用大规模重构代码;
缺点:没有强契约约束;一旦WC接口地址、路径变更,Mock不会有代码层面报错。
五、一个巨大误区澄清
❌ 误区:用Mock就不需要联调真实WC了
✅ 正确认知:职责分层
单元测试(CI门禁,强制跑):使用Mock
目标:验证你自己的代码
参数组装、JSON解析、数据转换、异常处理、本地数据库写入。
不验证线上WC本身是否正常。集成测试(人工手动触发,不放在CI门禁):真实调用线上WC
目标:验证整条真实链路
密钥有效性、网络连通、真实接口字段差异、线上权限。
两者互补,不能互相替代。
Mock负责保障你的代码逻辑不会持续腐烂;真实接口调用负责保障线上互通性。
六、Mock 和 你“本地OMS数据库”的关系
举一条完整同步流程:
- OMS触发同步 → 调用Gateway拉取WC订单
- Mock返回模拟订单JSON(没有外网请求)
- OMS代码解析JSON,转换成内部订单模型
- 写入你本地搭建的OMS数据库
👉本地数据库用来承接下游逻辑,Mock用来模拟上游WC。二者配合完成整条链路测试。
七、Mock 不能解决什么(边界认知)
- 不能模拟 WooCommerce 真实服务端BUG、真实权限限制
这类只能连通真实站点测试; - 无法验证网络延迟、防火墙、SSL、跨域、限流等网络层面问题;
- 如果WC官方接口后续修改字段,你手动维护的Mock返回数据不会自动更新。
应对方案:定期少量人工跑真实接口,同步更新Mock样本JSON。
Mock
全称
Mock Object,中文:模拟对象
日常开发大家直接简称:Mock
补充:
mock 本身是英文单词,本义「模仿、虚假的」;在测试领域专有名词是Mock Object(模拟对象)。
网络上常说的 Mock Server、HTTP Mock 属于衍生用法,根源都是 Mock Object 思想。
标准定义
在软件测试中,Mock Object 是一个用来替代真实外部依赖的伪造对象。
它实现了和真实依赖完全一致的对外接口,程序代码无感知,可以预先设定返回结果、抛出异常,消除对外部真实服务、数据库、第三方API的依赖。
放到你的场景翻译:
真实依赖 = WooCommerce API客户端
Mock对象 = 假的WC客户端,拥有一模一样的方法名,但是不会发起外网HTTP请求。
核心主要作用(结合你的OMS ↔ WooCommerce场景)
解除外部依赖,让测试可以离线运行
CI不需要访问外网buyntryparts.com,不受对方服务器宕机、网络波动、限流影响,测试稳定、速度快。自由构造各种正常/异常场景
线上真实WC很难稳定复现:401鉴权失败、接口超时、返回残缺数据、500错误。
Mock可以一键模拟这些情况,自动化测试你的异常捕获、重试、告警逻辑。隔离被测代码,精准定位Bug
测试只关心【你的OMS代码逻辑】;
如果测试失败,可以确定问题出在你自身代码,而不是第三方WC接口故障。支持并行开发(前后端/服务间)
如果WC接口还在调整,你可以先用Mock数据完成OMS同步逻辑开发,不用等对方接口就绪。避免测试污染线上环境
不再自动化频繁调用生产WC,不会产生测试订单、垃圾数据,保护正式业务,同时不用在CI存放线上密钥。
额外区分容易混淆概念
- Mock Object(代码层面,方案C用的)
面向类/方法,代码内部替换对象,适合单元测试。 - Mock Server(HTTP服务)
启动一个本地Web服务,模拟远端API地址,拦截HTTP请求,适合前端、不方便改后端代码的场景。
极简一句话总结
Mock Object = 和真实依赖拥有相同接口的替身,用来在测试中替代外部服务,摆脱外网依赖,可控构造返回数据。