WireMock 是一台會照你寫的規則回話的假 HTTP 伺服器。你把「什麼樣的請求該回什麼」寫成 JSON 丟給它,它就變成那個還沒做好、或是很難叫它出錯的下游服務。
fixedDelayMilliseconds 模擬慢速網路,觀察前端在高延遲下的實際行為。依我自己專案裡的使用情形估的比例,不是統計數字。
把 ./wiremock 掛進容器的 /home/wiremock,它啟動時就會自己去讀底下的 mappings/。
services:
wiremock:
image: wiremock/wiremock:3
container_name: wiremock
ports:
- "8080:8080"
volumes:
- ./wiremock:/home/wiremock
command:
- "--verbose"
- "--global-response-templating" --global-response-templating 打開之後,Response Body 可以用 Handlebars 語法動態插值(例如把請求的 query 參數原樣回填),回應就不必寫死。
/__admin/mappings/reset 就會重新載入整個 mappings/。
每條規則都分成 request(什麼樣的請求算命中)和 response(命中後回什麼)。點下面的場景看四種常見寫法。
{
"request": {
"method": "GET",
"url": "/api/users/123"
},
"response": {
"status": 200,
"headers": {
"Content-Type": "application/json"
},
"jsonBody": {
"id": 123,
"name": "Mock User"
}
}
} {
"request": {
"method": "POST",
"url": "/api/login",
"bodyPatterns": [
{
"matchesJsonPath": "$.account"
}
]
},
"response": {
"status": 200,
"fixedDelayMilliseconds": 2000,
"jsonBody": {
"token": "mock-token-xyz"
}
}
} {
"request": {
"method": "GET",
"url": "/api/broken"
},
"response": {
"status": 500,
"jsonBody": {
"error": "Internal Server Error"
}
}
} {
"request": {
"method": "GET",
"urlPath": "/api/search",
"queryParameters": {
"q": {
"equalTo": "keyword"
}
}
},
"response": {
"status": 200,
"jsonBody": {
"results": []
}
}
} priority 由小到大挑第一條(數字越小越優先,預設 5)。沒設 priority 又互相重疊,命中的是哪一條就不保證了——寫「例外情境」的規則時記得把它的 priority 調高。
這是新手最常卡住的地方:同一台 WireMock,從容器內外看到的位址不一樣。
http://localhost:8080 走的是 Docker 的 port mapping(8080:8080),從宿主機看過去就是 localhost。 http://wiremock:8080 同一個 Compose network 裡用 service name 當主機名,由 Docker 內建 DNS 解析。 localhost:8080 連不到 WireMock——localhost 指的是那個容器自己,不是宿主機,也不是隔壁的容器。徵狀通常是 Connection refused。
docker compose logs -f wiremock 最常用的一條。--verbose 開著時,沒對上的請求會印出它比對失敗在哪一項。 curl -X POST http://localhost:8080/__admin/mappings/reset 改完 mappings/ 下的 JSON 後呼叫,不必重啟容器。 curl http://localhost:8080/__admin/mappings 確認規則有沒有真的被載入——載入失敗多半是 JSON 格式錯了。 curl http://localhost:8080/__admin/requests 對方說「我打了但沒回」時,先看這裡有沒有收到請求,再看它比對到哪條規則。