使用指南

Simple Boot Mock Server 是一个功能强大的 Mock 服务,支持基于 JavaScript (GraalJS) 的脚本引擎,允许您通过编写脚本来动态生成响应数据,实现高度灵活的 Mock 逻辑。

安装运行

1. 下载运行

下载最新版发行包 (Zip):GitHub Releases

注意: 本地运行需要安装 Java 环境 (JRE/JDK 11+)。

  1. 下载并解压 zip 文件。
  2. 运行 bin/start.sh (Linux/macOS) 或 bin/start.bat (Windows)。

2. Docker 部署

使用 Docker 容器化部署是最简单快捷的方式:

docker run -d -p 9086:9086 fugary/simple-boot-mock-server:latest

Docker Hub 地址: fugary/simple-boot-mock-server

Docker 配置参数

支持以下环境变量配置 (-e):

变量名 默认值 说明
JAVA_OPTS -Xmx512M JVM 启动参数
MOCK_DB_TYPE h2 数据库类型,支持 h2mysql
MOCK_DB_DATA_DIR /data H2 数据库文件存放路径 (建议挂载)
MOCK_DB_H2_CONSOLE false 是否开启 H2 控制台
MOCK_DB_MYSQL_SERVER localhost MySQL 服务器地址 (仅 mysql 模式)
MOCK_DB_MYSQL_PORT 3306 MySQL 端口 (仅 mysql 模式)
MOCK_DB_MYSQL_DBNAME mock-db MySQL 数据库名称 (仅 mysql 模式)
MOCK_DB_USERNAME root 数据库用户名
MOCK_DB_PASSWORD 12345678 数据库密码
MOCK_DB_POOL_SIZE 5 数据库连接池大小

示例:使用 MySQL

docker run -d -p 9086:9086 \
  -e MOCK_DB_TYPE=mysql \
  -e MOCK_DB_MYSQL_SERVER=192.168.1.100 \
  -e MOCK_DB_USERNAME=root \
  -e MOCK_DB_PASSWORD=secret \
  fugary/simple-boot-mock-server:latest

基础入门

登录使用

默认启动后访问:http://localhost:9086

系统预置了两个账号:

角色 用户名 密码 说明
管理员 admin 12345678 拥有所有权限
普通用户 mock mock 仅能管理自己的项目

修改密码

登录后请第一时间修改密码。点击右上角头像进入【个人资料】,清空旧密码并设置新密码即可。

修改密码

Mock 分组

Mock 分组用于组织和管理接口。每个分组对应一组 API 接口。

Mock 分组列表

新增分组

点击【新增】,填写【分组名称】。可以直接设置【代理地址】,当 Mock 规则未匹配时,请求会自动转发到该地址。

新增分组

Mock 场景 (Scenarios)

场景 (Scenario) 用于在同一个 API 集合下管理不同的测试状态(如:正常、异常、超时等)。

  • 由于不同的测试用例往往需要接口表现出不同的响应,通过创建并切换场景,可以一键切换整个分组下所有请求的激活响应状态。
  • 分组始终会有一个默认场景,所有的请求响应都可以归属于特定场景。
场景管理

激活场景

在场景管理列表中,点击【激活】按钮即可将该场景设为当前激活场景。在激活特定场景后,所有关联了该场景的响应都会生效;如果没有特定场景响应,则降级使用默认场景的响应。修改响应数据时,也可以指定它属于哪个具体的场景。

Mock 请求

一个 Mock 分组下可以包含多个 Mock 请求。请求由 路径方法匹配规则 唯一确定。

Mock 请求列表

新建请求

填写请求路径(如 /api/user/info)和请求方法。

新建请求

测试请求

保存后点击【测试】按钮可直接测试 API。

  • 如果未配置响应且未配置代理:返回 404。
  • 如果配置了代理:转发请求到代理地址。
  • 如果配置了响应:返回配置的 Mock 数据。
测试请求

Mock 响应

每个请求可以配置多个响应数据(例如:成功、失败、异常),便于覆盖不同测试场景。

新建响应数据

支持配置 HTTP 状态码、响应头、延迟时间等。响应体支持 JSON、XML 等格式。

新建响应

默认响应与切换

当存在多条响应数据时,可以点击【设为默认】来指定当前生效的响应。这对于快速切换 "成功" / "失败" 场景非常有用。

默认响应切换

历史版本

每次修改响应数据都会自动记录历史版本,支持版本对比和回滚。

历史版本

请求对象 (Request)

属性 说明
request.body Body 内容对象
request.bodyStr Body 原始内容字符串
request.headers 请求头 Map
request.parameters Query 参数
request.pathParameters 路径参数
request.params 请求参数和路径参数合并 (快捷访问)

响应对象 (Response)

属性 说明
response.statusCode 状态码 (默认 200)
response.headers 响应头 Map
response.body 响应体对象
response.bodyStr 响应体字符串 (原始内容)
response.headers 响应头 Map (可修改)

JS & Mock.js 支持

系统内置 JavaScript 引擎 (基于 JDK ScriptEngine),支持 ES6 语法 (箭头函数等)。

支持使用 Mock.js 语法生成随机数据。

Mock.js 模板

Mock.mock({
    "code": "success",
    "data|10": [{
        "id": "@integer(1, 100)",
        "city": "@city",
        "image": "@image('200x100')"
    }]
})
Mock.js 示例

匹配规则

当同一个 URL 需要根据不同参数返回不同结果时,使用匹配规则。规则为 JS 表达式,返回 true 即匹配成功。

// 示例: 当参数 type 为 'vip' 且 header 中有 token 时匹配
request.params.type === 'vip' && request.headers.token

也支持使用自执行函数 (IIFE) 处理更复杂的逻辑:

(function () {
    if (request.params.name === "admin" && request.params.password === "123456") {
        return true;
    }
    return false;
}())
匹配规则

变量支持

在响应数据中,可以使用 request 对象获取请求参数,实现动态响应。

  • request.body: 请求体对象
  • request.params: 所有参数集合 (Path + Query)
  • request.headers: 请求头
Mock.mock({
    "input_id": request.params.id,
    "input_name": request.body.name,
    "timestamp": Date.now()
})

XML 支持

XML 响应同样支持 JS 模板语法 and 变量替换。

<user>
    <id>{{request.params.id}}</id>
    <name>{{Mock.mock('@cname')}}</name>
</user>

内置函数

除了 Mock.js,系统还预置了大量工具函数,用于加密、解码和日期处理。

函数签名 说明
decodeHex(hex) Hex 解码为字符串
encodeHex(data) 字符串编码为 Hex
md5Hex(data) MD5 加密 (Hex 输出)
md5Base64(data) MD5 加密 (Base64 输出)
sha1Hex(data) / sha1Base64(data) SHA1 加密
sha256Hex(data) / sha256Base64(data) SHA256 加密
btoa(data) / atob(data) Base64 编码 / 解码
encryptAES(data, key) AES 加密 (Base64)
decryptAES(data, key) AES 解密
encryptRSA(data, key) / decryptRSA(data, key) RSA 加密 / 解密
dayjs(date) 日期处理 (Day.js)
xml2Json(xmlStr) XML 字符串转 JSON
json2Xml(json, root) JSON 转 XML 字符串
fetch(url, options) 发送 HTTP 请求 (支持 async/await)
require(url) 动态加载远程 JS 库 (如 CryptoJS)

Fetch 异步请求

可以使用 fetch 请求第三方 API 并返回结果,支持 async/await

获取 JSON 数据:

(async function () {
    const response = await fetch('https://httpbin.org/get?name=mock');
    const json = await response.json();
    return {
        original: json,
        processed: true,
        timestamp: Date.now()
    };
}())

获取并返回二进制图片:

(async function () {
    const response = await fetch('https://httpbin.org/image/png');
    return await response.blob();
}())

动态加载库 (CryptoJS)

通过 require 可以加载远程 JS 库,处理复杂的加密逻辑 or 使用第三方算法。

(async function () {
    // 加载 CryptoJS 库
    const CryptoJS = await require('https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.2.0/crypto-js.min.js');
    
    const message = "hello world";
    const hash = CryptoJS.MD5(message).toString();
    const sha256 = CryptoJS.SHA256(message).toString();
    
    return {
        message: message,
        md5_hash: hash,
        sha256_hash: sha256
    };
}())

后置处理 (Post-Processor)

后置处理器允许您在响应生成后对其进行二次加工。支持修改状态码、头信息,或者将响应体从一种格式转换为另一种格式。

示例:将 XML 响应转换为 JSON

(function () {
  response.statusCode = 200;
  response.headers['Content-Type'] = 'application/json';
  return xml2Json(response.bodyStr);
}())

SSE 推送 (Event Stream)

对于需要模拟多消息推送 (Server-Sent Events) 的场景,可以返回一个特定的数组结构:

[{
  "data": "连接成功",
  "delay": 0
}, {
  "data": {"msg": "这是一条消息", "id": 1},
  "delay": 1000
}, {
  "data": "结束",
  "delay": 500
}]

系统会自动识别此格式并按照 delay 设定的毫秒数分段推送数据。