JSON路径没有值

时间:2018-05-25 07:48:28

标签: unit-testing spring-mvc mockito jsonpath mockmvc

如何为以下JSON编写mockMVC测试,该JSON具有String和Array的组合。

{
  "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'。根据JsonProvider,这不是json对象:'com.jayway.jsonpath.spi.json.JsonSmartJsonProvider'。

2 个答案:

答案 0 :(得分:3)

accounts属性是一个数组,因此:$.accounts.id必须使用索引器,例如:$.accounts[0].id

来自docs

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

如果您不确定要使用哪个索引,那么您可以过滤JSON并在过滤后的帐户子文档上断言。例如:

  • $.accounts[?(@.id == 1)].balance:返回$1000
  • $.accounts[?(@.accNbr == 12345)].id:返回1
  • ...... etc

docs中有更多详细信息,您可以使用JsonPath evaluator来解决此问题。

答案 1 :(得分:3)

正如@glytching和我所提到的,有一个数组,它应该与$.accounts[0].id一起使用。

如果您仍然遇到问题,我会尝试打印控制台的结果:

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

String content = result.getResponse().getContentAsString();