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

时间:2019-05-29 20:43:30

标签: spring-boot groovy spock wiremock

我正在使用Spock和Wiremock在Spring Boot 2.1.5应用程序中进行功能测试。传入的网址是:

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

是的,这是一个非常奇怪的网址,但我对此无能为力。

我已经使用以下命令在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”块中对看起来很奇怪的请求参数进行了建模。这行不通,因此我将正则表达式.*放在网址的末尾。

两个都给了我结果:

                                               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
                                                           |
                                                           |
-----------------------------------------------------------------------------------------------------------------------

如您所见,除了末尾的param部分,它基本上是匹配的,我根本不关心param,所以我希望只将其通配。

一种可能性是$符号使事情变得一团糟,我应该转而转义吗?如果可以,怎么办?

另一个是它的问号?。我尝试使用\?\\?进行转义,但这两个都不成功。

只考虑请求块中看起来很重要的部分:

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

我有seen it said elsewhere的话,如果您使用urlPath代替url,WireMock会将多余的标头或没有匹配参数的查询参数视为“无关紧要,仍然匹配”。但这似乎不是这种情况,因为错误输出显示。

进一步的讨论 此后,我尝试了各种组合,将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块的情况,以防万一这有助于匹配,但似乎没有任何效果。 我开始怀疑在obj/%.o : src/%.cc | obj $(build_obj_file) 调用中是否还需要设置其他标志?

2 个答案:

答案 0 :(得分:1)

已修复:基本上,您需要urlPath,没有queryParams和基于字符串的正则表达式模式,我通过以下方法解决了该问题:

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

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

答案 1 :(得分:0)

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

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