WireMock:临时禁用存根响应

WireMock: Temp disable stub response

我使用 WireMock 来存根来自远程服务器的响应。 在文件夹 wiremock/mappings 中,我有许多为存根设置规则的文件。 这里的例子:

{

  "request": {
    "method": "GET",
    "url": "/merchant"
  },
  "response": {
    "headers": {
      "Content-Type": "application/json"
    },
    "status": 200,
    "fixedDelayMilliseconds": 3000,
    "bodyFileName": "stub_response.json"
  }
}

如您所见,当我收到请求 /merchant 时,return 存根了来自文件 stub_response.json 的响应。 好的。工作正常。

但假设我需要临时禁用此响应。是否可以关闭存根响应和 return 来自远程服务器的真实响应?

我需要这样的标志:"disable" : true

在 WireMock 中可以吗?

目前没有规则的禁用属性。您可以删除 wiremock 规则并稍后重新添加它,这在功能上是相同的。

您可以使用 WireMock 管理界面禁用规则。如果您对 http://.../__admin/mappings/<guid> 调用 DELETE 命令,则映射将被删除。

您可以通过对 http://.../__admin/

执行 GET 命令来获取所有 guid 的列表

如果您想用真实响应而不是存根响应替换映射,您可以添加第二个映射,该映射的优先级低于存根响应并且代理到真实地址。通常,您的存根响应将无法使用,但是当您随后删除存根响应时,Wiremock 将代理到真实地址,因为它将成为最高优先级映射。

要添加代理,请将以下内容添加到响应映射中

"proxyBaseUrl" : "http://otherhost.com",

要设置映射的优先级,请将以下内容添加到您的映射中 JSON。

"priority": 1,

如果您 运行 Wiremock 作为 Stand-alone process, you can set it into recording mode,这实际上会将所有请求代理到目标 URL。

打开 http://localhost:8080/__admin/recorder(假设您在默认端口 8080 上启动 WireMock),您必须在该屏幕上输入目标 URL 并单击“记录”按钮。在您停止录制之前,它将使此 Wiremock 充当代理。

如果记录不是您实际需要的东西,您可以关闭记录的存根映射。虽然这有点误用了 Recorder 功能,但它是一种快速简便的方法,可以将您的 Wiremock 临时转换为代理,而不是使用存根进行响应。

Wiremock 可以 select 使用哪个夹具取决于它在哪个 state of a scenario 中运行。在不同的状态下,即使对于相同的请求,它也可以有不同的映射,从而以不同的方式表现(在一个状态下可以从固定装置响应,而在另一个状态下它可以转发到真实的API)。

假设有一个 Proxy 场景,当前处于默认的 Started 状态,那么所有查询都将由不特定于任何场景状态的存根。

但是如果 Proxy 场景处于 Active 状态,并且我们有一个特定于该场景状态的映射(requiredScenarioState 属性), 并且它的优先级高于默认值,那么这个映射将针对这个 Wiremock 实例的任何 URI 执行:

{
    "scenarioName": "Proxy",
    "requiredScenarioState": "Activated",
    "priority": 2,
    "request": {
        "urlPattern": ".*"
    },
    "response": {
        "proxyBaseUrl": "https://swapi.dev/api"
    }
}

当此映射匹配时,response.proxyBaseUrl 的值将使所有请求转发到提供的主机。

现在我们需要能够将 Proxy 场景切换到 Activated 状态并返回, 所以我们为这个 Wiremock 上的 POST /proxy 端点再定义两个映射。它们将具有更高的 优先级 - 1,因此它们甚至可以覆盖 "urlPattern": ".*".

的映射

将包含所有三个映射的 JSON 文件拖放到 wiremock/mappings:

{
    "mappings": [
        {
            "scenarioName": "Proxy",
            "requiredScenarioState": "Activated",
            "priority": 2,
            "request": {
                "urlPattern": ".*"
            },
            "response": {
                "proxyBaseUrl": "https://swapi.dev/api"
            }
        },
        {
            "priority": 1,
            "scenarioName": "Proxy",
            "requiredScenarioState": "Activated",
            "newScenarioState": "Started",
            "request": { "method": "POST", "url": "/proxy"},
            "response": { "status": 201, "body": "Proxy De-activated (Stubs will be used)" }
        },
        {
            "priority": 1,
            "scenarioName": "Proxy",
            "requiredScenarioState": "Started",
            "newScenarioState": "Activated",
            "request": { "method": "POST", "url": "/proxy" },
            "response": { "status": 201, "body": "Proxy Activated (Will forward all requests)" }
        }
    ]
}

现在可以将Proxy场景切换到Activated状态, 然后将其切换回 Started 状态:

curl http://localhost:8080/proxy -XPOST

这种方法的好处是可以将此映射文件从一个项目复制到另一个项目,只需进行极少的更改。