Нет значения в пути JSON - PullRequest
0 голосов
/ 25 мая 2018

Как написать тест mockMVC для приведенного ниже JSON с комбинацией строк и массивов.

{
  "id":1,
  "firstName":"NPA",
  "lastName":"TAS",
  "mobile":"123454321",
  "email":"ABCD@GMAIL.COM",
  "accounts":[
         {
          "id":1,
          "balance":"$1000",
          "custid":"1",
          "accNbr":"12345"
         }
            ]
}

Мой код:

@Test
        public void testJson() throws Exception {
            mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
            mockMvc.perform(get("/acc/1")
            .accept(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk())
            .andExpect(jsonPath("$.accounts.id", Matchers.is(1)))
            .andExpect(jsonPath("$.accounts.balance", Matchers.is("$1000")))
            .andExpect(jsonPath("$.accounts.accNbr", Matchers.is("12345")))
            .andExpect(jsonPath("$.accounts.custid", Matchers.is("1")))
            .andExpect(jsonPath("$.*", Matchers.hasSize(4)));
        }

я получаю исключение

Нет значения в JSON-пути "$ .accounts.id", исключение:

Ожидается найти объект со свойством ['accounts'] в пути $, но найдено 'net.minidev.json.JSONArray».Согласно JsonProvider, это не объект json: 'com.jayway.jsonpath.spi.json.JsonSmartJsonProvider'.

Однако, если я попытаюсь использовать $ .accounts [0] .id я получуисключение

Нет значения в JSON-пути "$ .accounts [0] .id", исключение:

Ожидается найти объект со свойством ['accounts'] в пути $, нонайдено 'net.minidev.json.JSONArray'.Это не объект json, согласно JsonProvider: 'com.jayway.jsonpath.spi.json.JsonSmartJsonProvider'.

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Как я и @glytching упомянул, существует массив, и он должен работать с $.accounts[0].id.

Если вы все еще столкнетесь с проблемой, я постараюсь напечатать результат вашей консоли:

MvcResult result = mockMvc.perform(MockMvcRequestBuilders
         .get("/acc/1").accept(MediaType.APPLICATION_JSON)).andReturn();

String content = result.getResponse().getContentAsString();
0 голосов
/ 25 мая 2018

Атрибут accounts является массивом, поэтому для этого: $.accounts.id потребуется использовать индексатор, такой как: $.accounts[0].id.

Из документов :

[<number> (, <number>)]     Array index or indexes

Если вы не уверены в том, какой индекс использовать, вы можете отфильтровать JSON и подтвердить вложенный документ отфильтрованного аккаунта.Например:

  • $.accounts[?(@.id == 1)].balance: возврат $1000
  • $.accounts[?(@.accNbr == 12345)].id: возврат 1
  • ... и т. Д.

Более подробная информация содержится в документах , и вы можете использовать оценщик JsonPath , чтобы поиграть с этим.

...