Тестирование с помощью spring-test-mvc jsonpath возвращает значение null

Я использую библиотеку Spring «spring-test-mvc» для тестирования веб-контроллеров. У меня есть очень простой контроллер, который возвращает массив JSON. Тогда в моем тесте у меня есть:

@Test
public void shouldGetAllUsersAsJson() throws Exception {
    mockMvc.perform(get("/v1/users").accept(MediaType.APPLICATION_JSON))
            .andExpect(content().mimeType(MediaType.APPLICATION_JSON))
            .andExpect(jsonPath("fName").exists());
}

Приведенный выше тест возвращает:

java.lang.AssertionError: No value for JSON path: fName

Чтобы быстро проверить, что я на самом деле получаю, я провел следующий тест:

@Test
public void shouldPrintResults() throws Exception {
    mockMvc.perform(get("/v1/users").accept(MediaType.APPLICATION_JSON))
            .andDo(print());
}

И он возвращает правильный массив JSON в теле MockHttpServletResponse

Я не уверен, почему jsonPath не видит fName в массиве JSON.


person jsf    schedule 13.11.2012    source источник


Ответы (2)


Если вы добавите зависимость пути json к maven или добавите банку в свою библиотеку, тогда это сработает. Я думаю, что Spring не включает зависимость jsonPath в последнем выпуске Spring 3.2.0 RC1. Я предполагаю, что это то же самое и для отдельного проекта Spring-Test-MVC.

Вот зависимость для Maven:

<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>0.8.1</version>
    <scope>test</scope>
</dependency>

Вам также может понадобиться библиотека hamcrest для использования jsonPath("$.test").value("test")

<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-library</artifactId>
    <version>1.3</version>
    <scope>test</scope>
</dependency>
person Brett Robison    schedule 13.11.2012
comment
У меня есть эти зависимости. Неудачно. То же сообщение об ошибке. - person jsf; 13.11.2012

Как выглядит ваше тело ответа json? Вы можете увидеть это, выполнив .andDo(print())

Возможно, вы захотите попробовать jsonPath("$.fName").

Предполагается, что ваш ответ json: {"fName":"first name"}

Если ваш ответ представляет собой массив, вам нужно jsonPath("$[0].fName") для ответа, например: [{"fName":"first name"},{"fName":"first name #2"}]

Вы можете увидеть больше примеров по адресу: http://goessner.net/articles/JsonPath/.

person Brett Robison    schedule 13.11.2012