如何为以下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'。
答案 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
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();