Проверить LocalDate в ответе JSON с помощью Spring MockMVC

Я пытаюсь проверить объект LocalDate в результате JSON, возвращаемом веб-службой Spring MVC, но не могу понять, как это сделать.

На данный момент я всегда сталкиваюсь с ошибками утверждения, такими как следующая:

java.lang.AssertionError: путь JSON "$[0].startDate" Ожидаемый: ‹2017-01-01>, но: был ‹[2017,1,1]>

Важная часть моего теста размещена ниже. Любые идеи, как исправить тест, чтобы пройти?

import static org.springframework.test.web.servlet.setup.MockMvcBuilders.standaloneSetup;

public class WebserviceTest {

    @Mock
    private Service service;

    @InjectMocks
    private Webservice webservice;

    private MockMvc mockMvc;

    @Before
    public void before() {
        mockMvc = standaloneSetup(webservice).build();
    }

    @Test
    public void testLocalDate() throws Exception {
        // prepare service mock to return a valid result (left out)

        mockMvc.perform(get("/data/2017")).andExpect(status().isOk())
            .andExpect(jsonPath("$[0].startDate", is(LocalDate.of(2017, 1, 1))));
    }
}

Веб-сервис возвращает список объектов представления, который выглядит следующим образом:

public class ViewObject {

    @JsonProperty
    private LocalDate startDate;
}

[изменить]

Еще одна попытка была

.andExpect(jsonPath("$[0].startDate", is(new int[] { 2017, 1, 1 })))

что привело к

java.lang.AssertionError: путь JSON "$[0].startDate" Ожидаемый: [‹2017>, ‹1>, ‹1>], но: был ‹[2017,1,1]>

[edit 2] Возвращенный объект startDate имеет тип: net.minidev.json.JSONArray


person GreenTurtle    schedule 09.10.2017    source источник


Ответы (4)


LocalDate в ответе JSON будет выглядеть как «startDate»:

"startDate": {
    "year": 2017,
    "month": "JANUARY",
    "dayOfMonth": 1,
    "dayOfWeek": "SUNDAY",
    "era": "CE",
    "dayOfYear": 1,
    "leapYear": false,
    "monthValue": 1,
    "chronology": {
        "id": "ISO",
        "calendarType": "iso8601"
    }
}

Итак, вы должны проверить каждый атрибут, как показано ниже:

.andExpect(jsonPath("$[0].startDate.year", is(2017)))
                .andExpect(jsonPath("$[0].startDate.dayOfMonth", is(1)))
                .andExpect(jsonPath("$[0].startDate.dayOfYear", is(1)))
person Amit K Bist    schedule 10.10.2017
comment
Я не знал, что вы используете jsr310, поэтому выше будет работать только для локальной даты, отличной от jsr310. - person Amit K Bist; 10.10.2017
comment
Извините: java.lang.AssertionError: нет значения в пути JSON $[0].startDate.year, исключение: ожидается найти объект со свойством ['year'] в пути $[0]['startDate'], но найден ' net.minidev.json.JSONArray». Это не объект json в соответствии с JsonProvider: «com.jayway.jsonpath.spi.json.JsonSmartJsonProvider». - person GreenTurtle; 10.10.2017

Это путь. Спасибо «Амиту К. Бисту», который указал мне правильное направление.

...
.andExpect(jsonPath("$[0].startDate[0]", is(2017)))
.andExpect(jsonPath("$[0].startDate[1]", is(1)))
.andExpect(jsonPath("$[0].startDate[2]", is(1)))
person GreenTurtle    schedule 10.10.2017

Это должно пройти:

.andExpect(jsonPath("$[0].startDate", is(LocalDate.of(2017, 1, 1).toString())));
person Jiří Švarc    schedule 27.05.2020

Я думаю, что на этом уровне вы проверяете Json, а не проанализированный объект. Итак, у вас есть строка, а не LocalDate.

Итак, в основном попробуйте изменить свой код в:

...
.andExpect(jsonPath("$[0].startDate", is("2017-01-01"))));
person marco    schedule 09.10.2017
comment
Это приводит к ошибке java.lang.AssertionError: путь JSON $[0].startDate Ожидается: 01.01.2017, но: было ‹[2017,1,1]› - person GreenTurtle; 09.10.2017