Spring MockMvc: поле Assert Json либо является пустым массивом, либо не существует

Я использую MockMvc для тестирования API, который возвращает содержимое JSON, и что JSON может содержать поле с именем shares в виде пустого массива или может вообще не существовать (я имею в виду разделяет поле).

Пример JSON:

{
    "id":1234,
     .....
    "shares":[]
}

//or

{
    "id":1234,
    ....
}

Как я могу утверждать, что это поле либо пусто, либо не существует

нравится:

mvc.perform(
    post("....url.......")
        .andExpect(status().is(200))
        // I need one of the following to be true, but this code will assert both of them, so it will fail
        .andExpect(jsonPath("$.shares").isEmpty())
        .andExpect(jsonPath("$.shares").doesNotExist())

person Nosairat    schedule 28.08.2019    source источник


Ответы (4)


Взгляните на условие JsonPath ИЛИ с использованием MockMVC

.andExpect(jsonPath("$.isPass", anyOf(is(false),is(true))));
person i.bondarenko    schedule 28.08.2019

Вот как вы можете проверить, что поле НЕ существует в полезной нагрузке json.

.andExpect(jsonPath("$.fieldThatShouldNotExist").doesNotExist())

Если вы хотите иметь возможность проверить, существует ли он и является ли он пустым ИЛИ не существует, вам придется написать свой собственный Matcher, чтобы создать поведение, подобное XOR. См. этот ответ в качестве руководства. Проверка в Hamcrest на наличие только одного элемента в списке с определенным свойством

person Kevin M    schedule 27.04.2021

Если у вас есть что-то вроде этого:

{ "arrayFieldName": [] }

Ты можешь использовать:

.andExpect( jsonPath( "$.arrayFieldName", Matchers.empty() );

что чище.

person marcello    schedule 09.06.2020
comment
Это не улавливает случай, когда поле не находится в теле json. - person Kevin M; 27.04.2021

person    schedule
comment
Это не улавливает случай, когда поле не находится в теле json. - person Kevin M; 27.04.2021