主流 Mock 回放工具对比:WireMock、Mountebank、VCR、Moco
要说 Mock 回放工具,市面上能打的其实就这几个。我个人这些年全用过,每个都踩过坑。今天咱们不聊官话,就拿实际项目经验说说它们到底好在哪、坑在哪。
WireMock — 当之无愧的 Java 圈主力
WireMock 是我用得最早、也是用得最久的 Mock 工具。它本质上是一个独立的 HTTP 服务器,你可以用 Java 代码或者 JSON 配置来定义 stub。
优点:
- 原生支持 HTTP/HTTPS,对 RESTful 接口非常友好
- 内置记录-回放模式(Record & Replay),录制一次就能自动生成 stub
- 支持状态化模拟(比如“第一次返回 201,第二次返回 409”)
- 社区活跃,插件多,比如扩缩容、延迟模拟、代理转发
缺点:
- 只能 Mock HTTP 协议,TCP、gRPC 不行
- Java 依赖较重,非 Java 项目集成起来有点别扭
- JSON stub 配置写多了容易混乱,我见过一个项目中 wiremock 目录下 300 多个 JSON 文件……
个人经验: 我在一个金融项目里用 WireMock 搭过完整的 CI 回放管道。那时候调用方依赖两个第三方支付接口,每次回归都要手动 mock。后来我们用录制模式跑一遍测试,自动生成 stub,然后注入到 CI 的 test 阶段。不过要注意——录制下来的 stub 可能包含敏感信息,比如 、签名。我们当时没注意,差点把生产环境的私钥录进 Git 里……后来加了一层脱敏脚本。
Mountebank — 协议自由,但学习曲线陡
Mountebank 是个有趣的项目。它用 Node.js 写的,但可以 mock 任意 TCP 协议,包括 HTTP、SMTP、WebSocket 甚至原始 socket。我建议把它当作“Mock 瑞士军刀”来用。
优点:
- 多协议支持:TCP、HTTP、HTTPS、SMTP 等等
- 动态响应:可以用 JavaScript 写响应逻辑,比如根据请求参数决定返回什么
- Inline JavaScript 能力,不需要预先定义一堆文件
- 跨平台,Node 环境即可运行
缺点:
- 启动慢,单实例性能不如 WireMock
- 文档有点碎片化,新手容易迷路
- 录制回放功能偏弱,它更擅长“提前定义”而不是“录制后回放”
避坑指南: 我曾经尝试在 CI 管道里用 Mountebank 同时模拟 HTTP 和 SMTP,结果因为端口配置冲突导致 job 跑了好几次都失败。后来统一用了 Docker Compose 隔离才搞定。所以我的建议是——除非你真的需要多协议,否则还是 WireMock 更省心。
VCR (Ruby 系) — 测试界的“录放机”
VCR 这个名字就很形象——它就像老式录像机,把真实的 HTTP 交互录下来,测试时回放。它不是一个独立的服务器,而是嵌入测试框架的库。Ruby 生态、Python(vcrpy)、JavaScript 都有移植版。
优点:
- 极简录制:加一行代码就能录下所有外部 HTTP 请求
- 与 RSpec、Minitest 等框架深度集成
- 录制文件是 YAML 格式,可读性强,方便修改
- 支持多种回放模式(once、new_episodes、all)
缺点:
- 只适用于测试内嵌的场景,不适合作为独立 Mock 服务
- 如果网络请求包含动态参数(时间戳、随机数),回放会匹配失败
- 大规模录制文件会膨胀得很厉害,一个项目动辄几百 MB 的 YAML
注意: 我有个 Ruby 项目用了 VCR 两年,后来团队换成了 Go,VCR 就无法直接迁移了。如果你团队语言不确定,慎选 VCR 这种强绑定生态的工具。
Moco — 极简主义的 Mock 框架
Moco 是一个国人开发的 Mock 框架,主打“零配置”。你只需要一个 JSON 文件,敲一行命令就能启动一个 HTTP Mock 服务。它适合快速原型、本地开发或者小团队。
优点:
- 配置简单:几行 JSON 就能定义一个接口
- 支持 HTTP、HTTPS、Socket、文件响应
- 可内嵌到 JUnit 测试,也可以在 JVM 外独立运行
- 体积小,一个 jar 包搞定
缺点:
- 功能相对弱:没有录制回放,没有状态模拟,没有延迟/故障注入
- 社区维护频率低,遇到 bug 可能没人修
- 不支持动态响应(只能用静态 JSON 或模板)
我的建议: 如果你只是需要快速 mock 一个接口看一眼前端效果,Moco 是最快的。但进入 CI 管道做自动化回归,它就不够用了。我在一个创业项目里用 Moco 顶了一个月,后来被迫切换成 WireMock——因为没有录制功能,每次接口改了都得手动更新 JSON,那叫一个痛苦。
横向对比一览
| 维度 | WireMock | Mountebank | VCR | Moco |
|---|---|---|---|---|
| 协议支持 | HTTP/HTTPS | 多协议(TCP/SMTP等) | HTTP 仅限 | HTTP/HTTPS/Socket |
| 录制回放 | ★ ★ ★ ★ | ★ ★ | ★ ★ ★ ★ ★ | ★ |
| 性能 | 高 | 中 | 高(内嵌) | 中 |
| 集成难度 | 低(Java) | 中 | 低(Ruby) | 极低 |
| CI 管道适用 | ★ ★ ★ ★ | ★ ★ ★ | ★ ★ ★ | ★ ★ |
总结一下:选工具看场景。Java 团队做 HTTP 回归,WireMock 是首选;要模拟 SMTP 或 TCP,试试 Mountebank;Ruby 测试框架自带 VCR 很方便;而 Moco 更适合快速启动、临时 mock。没有银弹,但了解每个工具的边界,你就能在 CI 管道里少踩很多坑。