Mock API 是一个模拟真实 API 行为的虚假接口。它接收相同的请求,返回相同格式的响应,并拥有一个可供调用的 URL。但在该 URL 背后,没有真实的数据库,没有业务逻辑,也没有真实的服务。其响应内容是你预先定义的。
这听起来似乎微不足道,其核心理念也确实简单。但它的价值在于它能让你做的事情:在后端服务尚未就绪,或者真实服务响应太慢、成本太高、不可靠时,让你能够针对接口进行开发和测试。本文将准确定义这一术语,区分 Mock 与其容易混淆的概念,并阐述决定 Mock 行为的“静态”与“动态”之别。
Mock API 的本质
剥开表象,Mock API 就是一个“请求-响应”映射表。当一个请求进入时,Mock 会根据你设定的规则进行匹配,选择一个响应并将其返回。除非你另有要求,否则中间没有任何计算过程。
一个 Mock 包含三个部分。首先是接口(Interface):它接收的路由、方法和参数,这些应与真实 API 完全一致。其次是响应定义(Response definition):它返回的 Body、状态码和 Header。最后是匹配逻辑(Matching logic):Mock 如何决定某个请求对应哪个响应,从简单的路径匹配到基于查询参数或 Header 的分支规则。
由于接口与真实 API 一致,调用 Mock 的代码并不知道它是假的。只需更换 Base URL,同一个客户端就能与真实服务通信。这种可互换性正是其核心意义所在。关于构建 Mock 的实战演练,可以参考这篇 Mock API 测试指南。
明确 Mock API “不是什么”也很有帮助。它不是缓存(Cache),因为缓存存储的是真实响应,而 Mock 是虚构响应。它不是沙箱(Sandbox),因为供应商沙箱运行的是真实的、简化版的逻辑,而 Mock 根本不运行逻辑。它也不是分级环境(Staging),因为 Staging 是真实系统的完整部署。Mock 比这三者都轻量:它只是一个 API 的“前门”,背后只有预定义的答案,别无他物。
Mock 与 Stub 的区别
人们常交替使用 “Mock” 和 “Stub”,但在测试领域,它们有着不同的含义。
Stub(桩) 是更简单的概念。它只为调用返回一个预设的答案,仅此而已。你向它请求一个用户,它返回一个固定的用户。Stub 不关心自己是如何被调用的。
在严格的测试意义上,Mock 还会验证交互。它可以断言自己是否被调用、调用了多少次以及使用了哪些参数。Mock 可能会因为调用方式错误而导致测试失败,而不仅仅是提供一个值。
在日常的 API 开发工作中,两者的界限比较模糊,“Mock API” 通常涵盖了这两者。一个有用的结论是:Stub 负责回答,Mock 负责回答并观察。当你的测试只关心代码接收到的数据时,Stub 风格的响应就足够了。当测试关心你的代码是否以正确的方式发起了正确的调用时,你就需要 Mock 提供的验证功能。关于更广泛的术语,请参阅 Validation 与 Verification 的区别。
还有两个相近的术语。Fake(伪对象) 是一个可以工作但经过简化的实现,例如用内存数据库代替真实数据库;它有逻辑,只是比较简单。Spy(间谍对象) 包装一个真实对象,并记录它如何被调用,而不改变其行为。在 API 开发语境下,Mock API 最接近于带有可选验证功能、通过 HTTP 在真实 URL 上提供服务的 Stub。你不需要刻意纠结这些词汇,但了解这个光谱有助于你在阅读测试文档时不至于迷失。
Mock API 与真实服务器
真实服务器和 Mock 服务器可以位于相同的 URL 并返回相同的 JSON,因此区别在于端点背后发生了什么。
| 特性 | Mock API | 真实服务器 |
|---|---|---|
| 端点背后 | 预定义的响应 | 实时逻辑和数据库 |
| 响应来源 | 你编写的规则 | 根据每个请求计算 |
| 数据 | 固定或生成的 | 真实的、持久化的 |
| 副作用 | 无 | 写入、扣费、发送邮件 |
| 速度 | 快速且稳定 | 随负载变化 |
| 正确性 | 符合你的定义 | 符合实际行为 |
真实服务器告诉你真相:它运行实际代码并证明系统可以工作。但它也很慢、有状态,并且会产生真实的副作用,因此针对它的测试可能会导致信用卡扣费或发送邮件。
Mock 服务器只告诉你你设定好的内容。它速度快、无副作用且完全可预测,这使其成为开发和大多数测试的理想选择。但 Mock 可能会出错且无法自知,因为它不运行真实逻辑。这就是为什么你仍需在真实服务器上保留部分测试的原因。这种权衡在 Mock 服务器 vs 真实服务器 中有深入探讨。
静态 Mock 与动态 Mock
Mock 返回响应的方式主要有两种,这种选择决定了 Mock 的使用体验。
静态 Mock 返回固定的 Payload。你编写一次精确的 JSON,每个匹配的请求都会得到完全相同的 Body。静态 Mock 是可预测的,这使得断言(Assert)非常容易。其弱点在于真实感:单个硬编码的 Payload 无法暴露代码在处理长字符串、空数组或意外的 Null 值时可能出现的 Bug。
动态 Mock 为每个请求生成响应。它不再返回固定的 "id": "user_1001",而是每次调用都生成一个新的 UUID。它不再返回同一个名字,而是每次返回不同的真实姓名。动态 Mock 通常由数据生成语法驱动,例如 Faker.js,因此名为 email 的字段会生成邮件地址,created_at 会生成日期。它们更具真实感,更擅长暴露边界情况,代价是难以进行精确断言。
大多数团队会同时使用两者。静态 Mock 用于需要已知值的、重断言的单元测试;动态 Mock 用于开发、演示和需要多样性而非固定答案的模糊测试(Fuzz-style)覆盖。
动态 Mock 还可以是条件化的,这是比简单生成更高阶的一步。条件 Mock 根据请求进行分支:对 /orders/404 的请求返回 404,带有错误 Token 的请求返回 401,其他请求返回正常的 200。这样,一个 Mock 端点就能同时覆盖正常路径(Happy path)和多个失败路径。这正是 Mock 在测试中真正发挥作用的地方,因为它可以复现健康真实服务器不会按需产生的错误响应。
Mock API 在开发流程中的位置
Mock API 在三个阶段非常有用。早期阶段,它让前端和后端团队达成契约并并行开发,互不等待。测试期间,它将你的代码与网络波动隔离,并让你触发真实服务器不会按需产生的错误响应。在演示和原型制作中,它提供受控、可预测的数据,没有实时依赖项,避免在演示中途崩溃。这些场景在 API Mock 使用案例指南 中有进一步探索。
反复出现的风险是偏离(Drift)。Mock 是接口的一个快照,而接口是会变化的。当真实 API 增加或重命名一个字段时,一个脱节的 Mock 仍会提供旧的格式,导致你的测试在针对一个已不存在的契约时依然通过。
解决方法是将 Mock 视为“派生”而非“创作”。从真实 API 发布的同一个 Schema 中生成 Mock,这样契约变更就会重新生成 Mock。手动编写的 Mock 是一个会迅速老化的副本;而从规范(Spec)生成的 Mock 永远是当前的快照。Apifox 就是这样工作的:你只需设计一次 API,Mock 端点就会根据该设计自动生成,并根据字段名推断出真实的数据。Mock、文档和 API 契约测试 全部读取自单一源头,从而保持同步。要体验从设计到 Mock 的完整流程,可以 下载 Apifox。
常见问题解答
简单来说,什么是 Mock API?
Mock API 是一个模仿真实 API 的虚假接口。它暴露相同的路由并返回相同格式的响应,但背后没有真实的逻辑或数据库。响应是预定义的,让你在真实服务存在之前就能针对接口进行构建和测试。
Mock 和 Stub 有什么区别?
Stub 只返回预设的响应。在严格的测试意义上,Mock 还会验证交互,因此它可以检查调用次数和参数是否正确。Stub 负责回答,Mock 负责回答并观察。
Mock API 与真实服务器有何不同?
Mock 返回预定义的响应,没有实际计算,因此速度快、可预测且无副作用。真实服务器针对真实数据库运行实际逻辑,速度较慢且有状态,但能证明系统真正可用。开发时使用 Mock,契约测试和端到端测试时使用真实服务器。
我应该使用静态 Mock 还是动态 Mock?
当你需要一个可预测的值进行断言时(适用于单元测试),使用静态 Mock。当你需要真实、多样的数据来捕捉边界情况时(适用于开发和演示),使用动态 Mock。许多团队会结合使用两者。
如何防止 Mock API 变得不准确?
应根据真实 API 发布的 Schema 生成 Mock,而不是手动编写。当契约变化时,Mock 会自动重新生成。配合针对真实 API 的定期契约测试,可以及早发现任何残留的偏离。
开发必备:API 全流程管理神器 Apifox
介绍完上文的内容,我想额外介绍一个对开发者同样重要的效率工具 —— Apifox。作为一个集 API 文档、调试、设计、测试、Mock、自动化测试于一体的工具,Apifox 是目前提升研发效率的首选。
如果你正在开发项目,不妨试试其极其友好的界面设计,它完全兼容 Postman 和 Swagger 数据格式,导入数据非常方便,,即使是新手也能很快上手,点击这里即可注册使用。

值得一提的是,除了个人和常规团队使用,针对有高安全合规要求、或需要在内网环境协作的企业,Apifox 还提供了深度定制的私有化部署方案。
获取专属报价与部署方案
详细的私有化部署系统架构与安全白皮书
针对您公司规模的专属报价单
免费的 1v1 专属产品演示 (Demo) 机会