spring启动单元测试json路径上没有值

piwo6bdm  于 2021-09-13  发布在  Java
关注(0)|答案(2)|浏览(414)

我想在spring boot中对创建和更新API进行测试:

  1. @Test
  2. public void shouldCreateNewUser() throws Exception, UserAlreadyExistException {
  3. User user = User.builder()
  4. .id(10L)
  5. .firstName("Alin")
  6. .lastName("Balan")
  7. .mail("alin@yahoo.com")
  8. .password("pass")
  9. .isAdmin(true)
  10. .role(Roles.PTE)
  11. .build();
  12. mvc.perform(MockMvcRequestBuilders.post("/api/users")
  13. .contentType(MediaType.APPLICATION_JSON)
  14. .content(mapper.writeValueAsString(user)))
  15. .andExpect(status().isOk())
  16. .andExpect(MockMvcResultMatchers.jsonPath("$[10].id",is(10)));
  17. Mockito.verify(userService, Mockito.times(1)).save(Mockito.any());
  18. }

但我有这个错误
java.lang.assertionerror:json路径“$[10].id”处没有值,异常:json不能为null或空

p5cysglq

p5cysglq1#

尽管有很多评论,但到目前为止还没有给出答案,我将总结如下:
如果您的api端点 POST /api/users 需要并返回以下json:

  1. {
  2. "id": 10,
  3. "firstName": "Alin",
  4. "lastName": "Balan",
  5. "mail": "alin@yahoo.com",
  6. "password": "pass",
  7. "isAdmin": true,
  8. "role": "PTE"
  9. }

然后您可以通过 jsonpath 使用:

  1. $.id
  2. $.firstName
  3. ...
  4. $.isAdmin
  5. $.role

$[10].id . 这里是一个基本的指南 jsonpath .
这意味着您的Assert应该如下所示:

  1. mvc.perform(MockMvcRequestBuilders.post("/api/users")
  2. .contentType(MediaType.APPLICATION_JSON)
  3. .content(mapper.writeValueAsString(user)))
  4. .andExpect(status().isOk())
  5. .andExpect(MockMvcResultMatchers.jsonPath("$.id",is(10)));
展开查看全部
vx6bjr1n

vx6bjr1n2#

搜索完整的错误消息时给出了类似的结果:json路径“$.name”处没有值,异常:json不能为null或空,使用mockmvc和spring引导

关于预期json响应的假设

当创建或更新单个用户时,您会期望单个用户对象作为json响应,而不是数组(包含10个用户元素)。
然后,您的Assert应该检查json响应中单个对象的id是否等于 10 :

  1. mvc.perform(MockMvcRequestBuilders.post("/api/users")
  2. .contentType(MediaType.APPLICATION_JSON)
  3. .content(mapper.writeValueAsString(user)))
  4. .andExpect(status().isOk())
  5. .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
  6. .andExpect(
  7. MockMvcResultMatchers.jsonPath("$.id", is(10))
  8. )
  9. );

解释

json path是一个用于选择json树节点的正式表达式(与选择xml元素的xpath相比)。
json路径表达式 $ 表示根节点
json路径 $[10] 计算到第11个元素(从零开始的索引!)数组的根。
json路径 $.id 计算为名为的字段 id 对象的根目录
另见:
baeldung:json路径简介
如何使用mockmvcresultmatchers.jsonpath

展开查看全部

相关问题