Wiremock 请求模式与请求参数匹配

Wiremock Request Pattern Matching with Request Parameters

我在 Spring Boot 2.1.5 应用程序中使用 spock 和 wiremock 进行功能测试。传入的url是:

/mockedserver/v1/Items('1010873195')/Products?$format=json

是的,这很奇怪 url,但我对此无能为力。

我在 JSON 中设置了一个路径匹配器:

{
  "request": {
    "method": "GET",
    "url": "/mockedserver/v1/Items('1010873195')/Products.*",
    "queryParams" : {
      "$format": "json"
    },
    "headers": {
      "x-csrf-token": "",
      "Accept": "application/json",
      "Content-Type": "application/json"
    }
  },
  "response": {
    "headers": {
      "Content-Type": "application/json"
    },
    "status": 200,
    "bodyFileName": "/../responses/mockedserver/get-products/1010873195-success-200.json"
  }
}

如您所见,我在 "queryParams" 块中模拟了看起来很奇怪的请求参数。这没有用,所以我将正则表达式 .* 放在 url.

的末尾

都给了我结果:

                                               Request was not matched
                                               =======================

-----------------------------------------------------------------------------------------------------------------------
| Closest stub                                             | Request                                                  |
-----------------------------------------------------------------------------------------------------------------------
                                                           |
GET                                                        | GET
/mockedserver/v1/Items('1010873195')/Produ                 | /mockedserver/v1/Items('1010873195')/Produ<<<<< URL does not match
cts                                                        | cts?$format=json
                                                           |
                                                           |
-----------------------------------------------------------------------------------------------------------------------

如你所见,它匹配,除了最后的参数部分,基本上,我不关心参数,所以我希望只是通配符。

一种可能是 $ 标志把事情弄得一团糟,我应该转义它吗?如果可以,怎么做?

另一个是问号,?。我试过用 \?\? 来逃避它,但都没有成功。

关于这里看起来很重要的请求块部分:

    "method": "GET",
    "url": "/mockedserver/v1/Items('1010873195')/Products.*",
    "queryParams" : {
      "$format": "json"
    },

我有 ,如果您使用 urlPath 代替 url,WireMock 会将额外的 headers 或没有匹配参数的查询参数视为 "don't care, match anyway" .但这里似乎并非如此,因为错误输出显示。

进一步讨论 从那以后,我尝试了各种组合,按照建议使用 urlPathurlPattern 甚至 urlPathPattern 来代替 url。所有这些导致:

                                               Request was not matched
                                               =======================

-----------------------------------------------------------------------------------------------------------------------
| Closest stub                                             | Request                                                  |
-----------------------------------------------------------------------------------------------------------------------
                                                           |
GET                                                        | GET
                                                           | /mockedserver/v1/Items('1010873195')/Produ<<<<< URL does not match. URLs must start with a /
                                                           | cts?$format=json
                                                           |
                                                           |
-----------------------------------------------------------------------------------------------------------------------

我也尝试过使用和不使用 queryParams 块,以防万一这有助于匹配,但它似乎没有任何效果。 我开始怀疑我是否需要在 stubFor 调用中设置其他标志?

我认为您需要在映射中尝试使用 "urlPathPattern" 或 "urlPath" 而不是 "url",如下所示:

"urlPathPattern": "/mockedserver/v1/Items('1010873195')/Products.*"

已修复:基本上,您需要 urlPath、不需要 queryParams 和一个 string-based 正则表达式模式,我用以下方法解决了这个问题:

/^\/mockedserver\/v1\/Items\('[0-9]{10}'\)\/Products/

基本上,它归结为正确的组合。