Mock 工具选型对比:WireMock、Mockoon、JSON Server、MSW 的特点与适用场景
1.1 为什么需要 Mock 工具?
在前后端分离开发或第三方 API 集成测试中,后端接口可能尚未完成、环境不稳定或存在安全限制。Mock 工具能够模拟真实 HTTP 服务的请求/响应行为,使前端或测试脚本可以独立验证逻辑,而无需依赖真实后端。
四种主流工具各有侧重:WireMock 偏向企业级服务虚拟化,Mockoon 强调桌面端快速原型,JSON Server 极简零配置,MSW 通过 Service Worker 在浏览器/Node 层拦截请求。
1.2 核心差异对比
| 特性 / 工具 | WireMock | Mockoon | JSON Server | MSW |
|---|---|---|---|---|
| 运行方式 | 独立 JAR / Docker / 嵌入 JUnit | 桌面 GUI 应用 + CLI | Node CLI 启动 | 浏览器 Service Worker / Node 拦截 |
| 响应匹配模式 | URL、Header、Body、正则、JSONPath | HTTP 方法 + 路径 + 查询参数 | 仅基于 JSON 文件中的路由 | REST / GraphQL handler 匹配 |
| 动态响应 | ✅ 支持模板、状态码、延迟模拟 | ✅ 内置响应编辑器,支持延迟 | ❌ 仅静态 JSON 返回 | ✅ 可编程的 handler 函数 |
| 错误/延迟模拟 | ✅ 全局或按匹配规则配置 | ✅ 每路由可配置延迟 & 状态码 | ⚠️ 需手动返回错误 JSON | ✅ handler 内直接返回 Error |
| 测试框架集成 | JUnit / TestNG / REST Assured | 通过 HTTP 调用,需独立进程 | 通过 HTTP 调用,需独立进程 | 原生 Jest / Cypress / Storybook |
| 日志 & 调试 | 详细请求记录,支持 Admin API 查询 | 内置日志面板,可观察每个请求 | 仅控制台输出 | 浏览器 DevTools 显示 Service Worker |
| 环境切换 | 多映射文件 / Profile | 多环境配置导出 | 多个 JSON 文件切换 | 运行时修改 handler 列表 |
| CI 自动化 | ✅ 命令行无头运行 | ✅ CLI 模式支持 | ✅ 简单 npm script | ✅ 集成到测试跑批 |
| 适用场景 | 企业级 API 虚拟化、契约测试 | 桌面端快速原型、单人调试 | 前端原型、CRUD 演示 | 前端组件测试、微前端 mock |
1.3 工具快速上手示例
WireMock(Java 嵌入方式)
// 使用 JUnit 4 Rule 启动
@Rule
public WireMockRule wireMockRule = new WireMockRule(8089);
@Test
public void testStub() {
stubFor(get(urlEqualTo("/api/users/1"))
.willReturn(aResponse()
.withStatus(200)
.withHeader("Content-Type", "application/json")
.withBody("{ \"id\": 1, \"name\": \"Alice\" }")));
// 调用后断言
given()
.when().get("http://localhost:8089/api/users/1")
.then().statusCode(200).body("name", equalTo("Alice"));
}
Mockoon(桌面环境)
// Mockoon CLI 启动预设环境
mockoon-cli start --data ./my-api.json --port 3001
// 请求示例(Mockoon 响应定义在 GUI 中)
GET http://localhost:3001/orders/123
// 返回预定 JSON
JSON Server
// db.json
{
"users": [
{ "id": 1, "name": "Bob" },
{ "id": 2, "name": "Carol" }
]
}
// 命令行启动
npx json-server --watch db.json --port 3000
// 自动生成 REST 路由:GET /users, POST /users 等
MSW (Mock Service Worker)
// src/mocks/handlers.js
import { http, HttpResponse } from 'msw'
export const handlers = [
http.get('https://api.example.com/user', () => {
return HttpResponse.json({ id: 1, name: 'Dave' })
}),
]
// setupTests.js
import { setupServer } from 'msw/node'
const server = setupServer(...handlers)
beforeAll(() => server.listen())
afterAll(() => server.close())
1.4 选型决策流程图
💡 选型建议: 如果团队已使用 Cypress 或 Jest 进行前端测试,强烈推荐 MSW 以避免真实网络调用;若后端 API 尚在开发且需要频繁修改,Mockoon 的可视化编辑可大幅提升调试效率。
1.5 总结
四种 Mock 工具覆盖了从“简单静态数据”到“企业级服务虚拟化”的不同需求层级。实际项目中可根据测试深度、开发阶段、团队技能灵活组合——例如开发阶段用 Mockoon 快速验证,集成测试阶段切换至 WireMock 写入 CI 流水线。