第二章 搭建第一个Mock服务:启动WireMock、定义静态响应、验证返回
本章通过实操完成你的第一个WireMock服务:从零启动实例、编写静态JSON映射,并使用curl验证返回结果。这是整个Mock工具链的起点,后续所有高级功能(动态响应、延迟模拟、断言等)都建立在此基础之上。
本章目标:掌握WireMock的三种启动方式、理解Stub映射文件结构、能够独立配置一个返回固定JSON的Mock端点并通过HTTP请求验证。
核心流程
下图展示了搭建并验证第一个Mock服务的完整步骤:
启动WireMock服务
WireMock支持三种启动方式:独立JAR、Docker容器、内嵌在测试代码中。本章使用最快捷的独立JAR方式。
# 下载WireMock Standalone JAR(若未下载)
wget https://repo1.maven.org/maven2/org/wiremock/wiremock-standalone/3.9.1/wiremock-standalone-3.9.1.jar
# 启动服务,监听8080端口
java -jar wiremock-standalone-3.9.1.jar --port 8080
启动成功后控制台将输出类似信息:
WireMock server started at http://localhost:8080
端口冲突处理:若8080被占用,可使用
--port 9090 或其他端口,后续所有URL相应调整。
定义静态响应(Stub映射)
WireMock使用JSON文件描述请求与响应的映射关系。所有映射文件放置在启动目录下的 mappings/ 文件夹中,服务启动时会自动加载。
创建文件 mappings/hello-stub.json:
{
"request": {
"method": "GET",
"url": "/api/hello"
},
"response": {
"status": 200,
"headers": {
"Content-Type": "application/json"
},
"jsonBody": {
"message": "Hello from WireMock!",
"timestamp": "2025-01-01T12:00:00Z"
}
}
}
| 字段 | 说明 | 示例值 |
|---|---|---|
request.method | 匹配的HTTP方法(GET/POST/PUT等) | "GET" |
request.url | 匹配的请求路径(精确匹配) | "/api/hello" |
response.status | 返回的HTTP状态码 | 200 |
response.jsonBody | 返回的JSON对象(自动设置Content-Type为application/json) | {"message":"Hello"} |
文件位置必须正确:WireMock默认从当前工作目录下的
mappings/ 子目录读取映射文件。若文件放在其他位置,需要 --root-dir 参数指定。
验证返回结果
启动WireMock后,使用curl或浏览器发送请求:
curl -v http://localhost:8080/api/hello
应当看到返回的JSON响应:
{
"message": "Hello from WireMock!",
"timestamp": "2025-01-01T12:00:00Z"
}
同时WireMock控制台会记录请求日志:
INFO: Request received:
GET /api/hello
Matched stub: hello-stub.json
验证小技巧:使用
curl -w "\nHTTP状态码: %{http_code}\n" 可同时打印响应体与状态码,便于断言。
常见启动参数速查
| 参数 | 作用 | 示例 |
|---|---|---|
--port | 指定监听端口 | --port 9090 |
--root-dir | 指定映射文件根目录 | --root-dir ./wiremock |
--verbose | 开启详细日志,打印每次请求匹配详情 | --verbose |
--global-response-templating | 启用响应模板(后续动态响应章节使用) | --global-response-templating |
本章小结
- 成功启动WireMock独立实例并监听指定端口。
- 在
mappings/目录下编写了第一个静态JSON映射,定义了GET /api/hello返回固定JSON。 - 通过curl发送请求并验证了状态码200与响应体内容。
- WireMock自动加载映射文件,无需重启服务即可生效(后续章节将介绍热加载细节)。