Mock 工具选型对比:WireMock、Mockoon、JSON Server、MSW 的特点与适用场景

1.1 为什么需要 Mock 工具?

在前后端分离开发或第三方 API 集成测试中,后端接口可能尚未完成、环境不稳定或存在安全限制。Mock 工具能够模拟真实 HTTP 服务的请求/响应行为,使前端或测试脚本可以独立验证逻辑,而无需依赖真实后端。

四种主流工具各有侧重:WireMock 偏向企业级服务虚拟化,Mockoon 强调桌面端快速原型,JSON Server 极简零配置,MSW 通过 Service Worker 在浏览器/Node 层拦截请求。

1.2 核心差异对比

特性 / 工具WireMockMockoonJSON ServerMSW
运行方式独立 JAR / Docker / 嵌入 JUnit桌面 GUI 应用 + CLINode CLI 启动浏览器 Service Worker / Node 拦截
响应匹配模式URL、Header、Body、正则、JSONPathHTTP 方法 + 路径 + 查询参数仅基于 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 选型决策流程图

Mock工具选型决策流程 Mock 工具选型决策流程 选择 Mock 工具 是否需要与测试框架深度集成? MSW (Service Worker) 浏览器/Node 拦截,原生集成 否 WireMock (企业级) JAR/Docker,正则/JSONPath 否 JSON Server (极简) 仅需 JSON 文件,CRUD 自动 需要可视化 GUI? Mockoon (桌面GUI) 可视化编辑,单机调试 选型要点总结 ✅ 测试框架集成优先 → MSW ✅ 复杂匹配/企业级 → WireMock ✅ 可视化快速原型 → Mockoon ✅ 简单 CRUD 演示 → JSON Server
💡 选型建议: 如果团队已使用 Cypress 或 Jest 进行前端测试,强烈推荐 MSW 以避免真实网络调用;若后端 API 尚在开发且需要频繁修改,Mockoon 的可视化编辑可大幅提升调试效率。

1.5 总结

四种 Mock 工具覆盖了从“简单静态数据”到“企业级服务虚拟化”的不同需求层级。实际项目中可根据测试深度、开发阶段、团队技能灵活组合——例如开发阶段用 Mockoon 快速验证,集成测试阶段切换至 WireMock 写入 CI 流水线。