Проверьте наличие нулевых значений в теле запроса с помощью Wiremock - PullRequest
1 голос
/ 14 января 2020

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

My Bad Bad body:

{
  "cat": null,
  "dog": {
    "id": 1344
},
  "horse": {
    "id": 1
},
  "fish": 1
}

My Stub:

wireMockServer.stubFor(post(urlEqualTo("/sample-api"))
            .withRequestBody(matchingJsonPath("$.^[a-z]*", equalTo(null)))
            .willReturn(aResponse()
                    .withStatus(400)
                    .withHeader("Content-Type", "application/json")))

В этом примере я ожидаю, что заглушка будет соответствовать "cat", так как ее значение равно нулю. Это не тот случай. Может кто-нибудь сказать мне, что я делаю не так?

Ответы [ 2 ]

1 голос
/ 31 января 2020

Если вы не знали обо всех возможных ключах, вы могли бы использовать Custom Request Matcher , чтобы проверить, содержало ли тело запроса какие-либо нулевые значения, и, если это так, вернуть ошибку 400. Я бы порекомендовал создать свой собственный класс, похожий на ...

public class BodyNullCheck extends RequestMatcherExtension {
    @Override
    public MatchResult match(Request request, Parameters parameters) {
        JSONParser parser = new JSONParser();
        try {
            JSONObject body = (JSONObject) parser.parse(request.getBody().toString());
            for(Iterator iterator = body.keySet().iterator(); iterator.hasNext();) {
                String key = (String) iterator.next();
                if (body.get(key) == null) {
                    return MatchResult.of(true);
                }
            }
        } catch (ParseException ex) {
                ex.printStackTrace();
        }

        return MatchResult.of(false);
    }
}

Выше приведено тело запроса, которое преобразуется в JSONObject, а затем перебирает все ключи в JSONObject. Если какое-либо из их значений равно null, мы вернем true. Если после перебора всех из них значение null не найдено, мы возвращаем false.

1 голос
/ 15 января 2020

В документации WireMock в Запрос соответствия в разделе JSON Поиск пути . В исходном коде имеется ссылка на используемую библиотеку com.jayway.jsonpath.JsonPath. build.gradle относится к версии 2.4.0. Документацию по библиотеке путей Jayway JSON можно найти на странице проекта Github . Существует хороший, но отнюдь не идеальный онлайн-оценщик здесь .

Документация WireMock показывает только поддержку регулярного выражения для значений узлов в виде " совпаденийJsonPath ». В документации Jayway есть онлайн-пример: $ .. book [? (@. Author = ~ /.*REES/i)]. По этой причине единственный подход - назвать все узлы, которым не разрешено быть null.

В приведенном ниже примере сопоставления будут проверены все упомянутые узлы, независимо от их глубины (см. @Id). Это отображение не сработает, если все упомянутые узлы не равны NULL, но некоторые из не упомянутых узлов.

{
  "request": {
    "urlPattern": "/sample-api",
    "method": "GET",
    "bodyPatterns" : [ {
      "matchesJsonPath" : "$..[?(@.cat == null || @.dog == null || @.horse == null || @.fish == null || @.id == null)]"
    } ] 
  },
  "response": {
    "status": "400",
    "headers": {
      "Content-Type": "application/json; charset=utf-8"
    },
    "jsonBody": {
      "message": "some sapi message"
    }
  }
}
...