Сопоставление объекта в JSON с jsonpath в Spring Boot Test - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь написать модульные тесты для конечной точки покоя с помощью Spring Boot Test, который идет хорошо, но когда я пытаюсь утвердить объект в ответе json с помощью jsonPath, AssertionError генерируется даже тогда, когда содержимое идентично ито же самое.

Пример Json

{
"status": 200,
"data": [
    {
        "id": 1,
        "placed_by": 1,
        "weight": 0.1,
        "weight_metric": "KG",
        "sent_on": null,
        "delivered_on": null,
        "status": "PLACED",
        "from": "1 string, string, string, string",
        "to": "1 string, string, string, string",
        "current_location": "1 string, string, string, string"
    }
]

}

Код в Kotlin

mockMvc.perform(
        get("/api/v1/stuff")
            .contentType(MediaType.APPLICATION_JSON_UTF8)
    ).andExpect(status().isOk)
        .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
        .andExpect(jsonPath("\$.status").value(HttpStatus.OK.value()))
        .andExpect(jsonPath("\$.data.[0]").value(equalTo(stuffDTO.asJsonString())))

Выдает AssertionError, но значения одинаковы Assertion Error Log

Нажав на разницу, вы увидите:

enter image description here

Как сопоставить объект в JSON сjsonPath? Мне нужно иметь возможность сопоставлять объект, потому что объект может содержать много полей, и это будет PITA для сопоставления их индивидуально

1 Ответ

0 голосов
/ 11 июля 2019

Я столкнулся с тем, что похоже на ту же проблему, хотя трудно сказать, не зная, какая у вас функция asJsonString.Также я использовал Java, а не Kotlin.Если это та же проблема:

Это связано с тем, что jsonPath(expression) не возвращает строку, поэтому ее сопоставление с одной не работает.Вам необходимо преобразовать stuffDTO в правильный тип для сопоставления, используя JsonPath т.е.в такой функции, как:

private <T> T asParsedJson(Object obj) throws JsonProcessingException {
    String json = new ObjectMapper().writeValueAsString(obj);
    return JsonPath.read(json, "$");
}

Тогда .andExpect(jsonPath("\$.data.[0]").value(equalTo(asParsedJson(stuffDTO)))) должно работать.

...