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

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

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

@Test
public void shouldCreateNewUser() throws Exception, UserAlreadyExistException {

    User user = User.builder()
            .id(10L)
            .firstName("Alin")
            .lastName("Balan")
            .mail("alin@yahoo.com")
            .password("pass")
            .isAdmin(true)
            .role(Roles.PTE)
            .build();

    mvc.perform(MockMvcRequestBuilders.post("/api/users")
            .contentType(MediaType.APPLICATION_JSON)
            .content(mapper.writeValueAsString(user)))
            .andExpect(status().isOk())
            .andExpect(MockMvcResultMatchers.jsonPath("$[10].id",is(10)));

    Mockito.verify(userService, Mockito.times(1)).save(Mockito.any());
}

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

p5cysglq

p5cysglq1#

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

{
    "id": 10,
    "firstName": "Alin",
    "lastName": "Balan",
    "mail": "alin@yahoo.com",
    "password": "pass",
    "isAdmin": true,
    "role": "PTE"
}

然后您可以通过 jsonpath 使用:

$.id
$.firstName
...
$.isAdmin
$.role

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

mvc.perform(MockMvcRequestBuilders.post("/api/users")
            .contentType(MediaType.APPLICATION_JSON)
            .content(mapper.writeValueAsString(user)))
            .andExpect(status().isOk())
            .andExpect(MockMvcResultMatchers.jsonPath("$.id",is(10)));
vx6bjr1n

vx6bjr1n2#

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

关于预期json响应的假设

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

mvc.perform(MockMvcRequestBuilders.post("/api/users")
   .contentType(MediaType.APPLICATION_JSON)
   .content(mapper.writeValueAsString(user)))
   .andExpect(status().isOk())
   .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
   .andExpect(
       MockMvcResultMatchers.jsonPath("$.id", is(10))
   )
);

解释

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

相关问题