主流 Mock 回放工具对比:WireMock、Mountebank、VCR、Moco

要说 Mock 回放工具,市面上能打的其实就这几个。我个人这些年全用过,每个都踩过坑。今天咱们不聊官话,就拿实际项目经验说说它们到底好在哪、坑在哪。

Mock 回放工具选型决策图 选型考虑 协议 / 语言 / 团队规模 WireMock Java 生态·HTTP/HTTPS Mountebank 多协议·动态响应 VCR (Ruby 系) 录制回放·轻量级 Moco 零配置·快速启动 选择要点 • 团队语言:Java→WireMock/Moco • 多协议:Mountebank • Ruby/Python 测试:VCR

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 管道里少踩很多坑。