如何为同一URL在WireMock中配置两个不同的错误重试后成功场景?
在WireMock中配置多场景请求响应规则
完全可以通过WireMock的**Scenarios(场景)**功能实现你需要的两个独立请求响应流,每个场景会维护自身的状态流转,即使针对同一URL也不会互相干扰。
场景1:"server error 3 times"
针对目标URL,实现前3次请求返回503,第4次及之后返回200:
JSON配置示例(可放入WireMock mappings目录)
[ { "request": { "method": "GET", "url": "/your-target-url" }, "response": { "status": 503, "body": "Service Unavailable" }, "scenarioName": "server error 3 times", "requiredScenarioState": "Started", "newScenarioState": "after-1st-503" }, { "request": { "method": "GET", "url": "/your-target-url" }, "response": { "status": 503, "body": "Service Unavailable" }, "scenarioName": "server error 3 times", "requiredScenarioState": "after-1st-503", "newScenarioState": "after-2nd-503" }, { "request": { "method": "GET", "url": "/your-target-url" }, "response": { "status": 503, "body": "Service Unavailable" }, "scenarioName": "server error 3 times", "requiredScenarioState": "after-2nd-503", "newScenarioState": "success-state" }, { "request": { "method": "GET", "url": "/your-target-url" }, "response": { "status": 200, "body": "Success" }, "scenarioName": "server error 3 times", "requiredScenarioState": "success-state" } ]
场景2:"authorization error 3 times"
同样针对目标URL,实现前3次请求返回403,第4次及之后返回200:
JSON配置示例
[ { "request": { "method": "GET", "url": "/your-target-url" }, "response": { "status": 403, "body": "Forbidden" }, "scenarioName": "authorization error 3 times", "requiredScenarioState": "Started", "newScenarioState": "after-1st-403" }, { "request": { "method": "GET", "url": "/your-target-url" }, "response": { "status": 403, "body": "Forbidden" }, "scenarioName": "authorization error 3 times", "requiredScenarioState": "after-1st-403", "newScenarioState": "after-2nd-403" }, { "request": { "method": "GET", "url": "/your-target-url" }, "response": { "status": 403, "body": "Forbidden" }, "scenarioName": "authorization error 3 times", "requiredScenarioState": "after-2nd-403", "newScenarioState": "auth-success-state" }, { "request": { "method": "GET", "url": "/your-target-url" }, "response": { "status": 200, "body": "Success" }, "scenarioName": "authorization error 3 times", "requiredScenarioState": "auth-success-state" } ]
使用说明
- 场景隔离:两个场景通过
scenarioName字段区分,各自维护独立的状态,不会互相干扰。 - 状态流转:每个stub通过
requiredScenarioState指定触发的当前场景状态,newScenarioState设置响应后的新状态。初始状态固定为Started(WireMock内置的初始状态)。 - 重置场景:如果需要重新测试某个场景,可以通过WireMock的管理API重置场景状态:
# 重置server error场景到初始状态 curl -X POST http://localhost:8080/__admin/scenarios/server%20error%203%20times/state --data '"Started"' -H "Content-Type: application/json" # 重置authorization error场景到初始状态 curl -X POST http://localhost:8080/__admin/scenarios/authorization%20error%203%20times/state --data '"Started"' -H "Content-Type: application/json"
Java代码配置示例(可选)
如果使用WireMock的Java API,可以这样配置:
import static com.github.tomakehurst.wiremock.client.WireMock.*; public class WireMockScenarios { public static void main(String[] args) { WireMockServer wireMockServer = new WireMockServer(8080); wireMockServer.start(); // 配置server error场景 wireMockServer.stubFor(get(urlEqualTo("/your-target-url")) .inScenario("server error 3 times") .whenScenarioStateIs(STARTED) .willReturn(aResponse().withStatus(503).withBody("Service Unavailable")) .willSetStateTo("after-1st-503")); wireMockServer.stubFor(get(urlEqualTo("/your-target-url")) .inScenario("server error 3 times") .whenScenarioStateIs("after-1st-503") .willReturn(aResponse().withStatus(503).withBody("Service Unavailable")) .willSetStateTo("after-2nd-503")); wireMockServer.stubFor(get(urlEqualTo("/your-target-url")) .inScenario("server error 3 times") .whenScenarioStateIs("after-2nd-503") .willReturn(aResponse().withStatus(503).withBody("Service Unavailable")) .willSetStateTo("success-state")); wireMockServer.stubFor(get(urlEqualTo("/your-target-url")) .inScenario("server error 3 times") .whenScenarioStateIs("success-state") .willReturn(aResponse().withStatus(200).withBody("Success"))); // 配置authorization error场景 wireMockServer.stubFor(get(urlEqualTo("/your-target-url")) .inScenario("authorization error 3 times") .whenScenarioStateIs(STARTED) .willReturn(aResponse().withStatus(403).withBody("Forbidden")) .willSetStateTo("after-1st-403")); wireMockServer.stubFor(get(urlEqualTo("/your-target-url")) .inScenario("authorization error 3 times") .whenScenarioStateIs("after-1st-403") .willReturn(aResponse().withStatus(403).withBody("Forbidden")) .willSetStateTo("after-2nd-403")); wireMockServer.stubFor(get(urlEqualTo("/your-target-url")) .inScenario("authorization error 3 times") .whenScenarioStateIs("after-2nd-403") .willReturn(aResponse().withStatus(403).withBody("Forbidden")) .willSetStateTo("auth-success-state")); wireMockServer.stubFor(get(urlEqualTo("/your-target-url")) .inScenario("authorization error 3 times") .whenScenarioStateIs("auth-success-state") .willReturn(aResponse().withStatus(200).withBody("Success"))); } }
内容的提问来源于stack exchange,提问作者tarekahf
相关产品推荐
相关产品推荐

