Сбой теста случайной строки Java Wiremock

Я генерирую некоторый JSON, который я использую Wiremock для тестирования. Однако теперь мне нужно добавить случайно сгенерированную строку в JSON, которая, очевидно, меняется при каждом запуске моего теста. Это приводит к тому, что утверждение не выполняется. У кого-нибудь есть идеи, как мне обойти эту проблему?

Json:

"data": {
    "case": {
      "user": {
        "name": {
          "title": "Mr",
          "firstName": "John",
          "lastName": "Smith"
        },
        "address": { }
      }
    },
    "subscriptions": {
      "userSubscription": {
        "randomNumber": "{{I am a random string so fail}}",
        "email": null,
        "mobile": null
      },
      "supporterSubscription" : null
   }
}

Тестовое задание:

@Test
public void should_handle_callback()
    throws Exception {

    submitStub();

    HttpEntity<String> request = new HttpEntity<>("string");

    // fails
    ResponseEntity<CallbackResponse> result =
        this.restTemplate.postForEntity(baseUrl, request, CallbackResponse.class);
}

private static String loadJson(String fileName) throws IOException {
    URL url = getResource(fileName);
    return Resources.toString(url, Charsets.toCharset("UTF-8"));
}

private void submitStub() throws Exception {

    ccdServer.stubFor(post(concat(SUBMIT_EVENT_URL))
            .withHeader(AUTHORIZATION, equalTo(USER_AUTH_TOKEN))
            .withHeader(SERVICE_AUTHORIZATION_HEADER_KEY, equalTo(SERVICE_AUTH_TOKEN))
            .withHeader(CONTENT_TYPE, equalTo(MediaType.APPLICATION_JSON_UTF8_VALUE))
            .withRequestBody(equalToJson(createCaseRequest))
            .willReturn(aResponse()
                .withHeader(CONTENT_TYPE, APPLICATION_JSON_VALUE)
                .withStatus(200)
                .withBody(loadJson("testjson.json"))));
}

1 ответ

Я не верю, что есть какие-либо "нестандартные" способы утверждать против подстановочных знаков внутри тела запроса. Я сталкивался с подобной проблемой в прошлом и использовал запросы критериев в прошлом, которые работают достаточно хорошо.

http://wiremock.org/docs/verifying/

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

Код должен выглядеть примерно так:

List<LoggedRequest> requests = findAll(postRequestedFor(urlMatching("/api/.*")));

Получив этот список запросов, вы можете просмотреть результаты, чтобы выяснить, содержит ли одно из тел LoggedRequest нужный вам json.

Хорошей библиотекой для проверки соответствия JSON с подстановочными знаками является JSON-Unit, который позволяет заполнять поля, которые автоматически генерируются с помощью ${json-unit.ignore}.

https://github.com/lukas-krecan/JsonUnit

Ваше утверждение может выглядеть примерно так:

assertThatJson(requests.get(0).getBodyAsString())
  .isEqualTo("{\"id\":\"${json-unit.ignore}\",\"name\":\"bob\"}");
Другие вопросы по тегам