You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为同一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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 00:55:02