Сопоставление шаблона запроса Wiremock с параметрами запроса

Я использую spock и wiremock для функционального тестирования в приложении Spring Boot 2.1.5. Входящий 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
                                                           |
                                                           |
-----------------------------------------------------------------------------------------------------------------------

Как видите, он совпадает, за исключением части param в конце, в основном меня не волнует параметр, поэтому я надеялся просто выделить его.

Одна из возможностей состоит в том, что знак $ вносит беспорядок, должен ли я вместо этого убегать от него? если да, то как?

Во-вторых, это вопросительный знак ?. Я попытался избежать этого с помощью \? и \\?, оба из которых оказались безуспешными.

Что касается той части блока запроса, которая здесь выглядит важной:

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

Я видел в другом месте, что если вы используете urlPath вместо url, что WireMock обрабатывает лишние заголовки или параметры запроса без параметров соответствия как «все равно, все равно совпадать». Но, как видно из сообщения об ошибке, здесь это не так.

ДАЛЬНЕЙШЕЕ ОБСУЖДЕНИЕ. С тех пор я пробовал различные комбинации, помещая urlPath, urlPattern и даже 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?


person Michael Coxon    schedule 29.05.2019    source источник


Ответы (2)


Исправлено: в основном вам нужен urlPath, без queryParams и строковый шаблон регулярного выражения, который я решил с помощью:

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

По сути, все сводилось к правильному сочетанию вещей.

person Michael Coxon    schedule 30.05.2019

Я считаю, что вам нужно попробовать urlPathPattern или urlPath вместо url в вашем сопоставлении следующим образом:

"urlPathPattern": "/mockedserver/v1/Items('1010873195')/Products.*"
person Anton Hlinisty    schedule 30.05.2019
comment
Спасибо за предложение: я пробовал urlPath, urlPattern и, хотя у меня не было документации по нему, urlPathPattern вместо url. Все это привело к тому, что совпадающей заглушки не было вообще. Другими словами, closest match: / - person Michael Coxon; 30.05.2019
comment
Я только что обновил вопрос, добавив дополнительные сведения, включая ваше предложение @AntonHinisty - person Michael Coxon; 31.05.2019