0

我想在 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 或为空

4

2 回答 2

0

看到尽管有很多评论,到目前为止还没有发布任何答案,我将总结一下:

如果您的 API 端点POST /api/users 需要并返回以下 JSON:

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

然后您可以通过以下方式查询此 JSON jsonpath

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

不是$[10].id是关于jsonpath.

这意味着您的断言应如下所示:

    mvc.perform(MockMvcRequestBuilders.post("/api/users")
            .contentType(MediaType.APPLICATION_JSON)
            .content(mapper.writeValueAsString(user)))
            .andExpect(status().isOk())
            .andExpect(MockMvcResultMatchers.jsonPath("$.id",is(10)));
于 2021-07-26T20:41:39.753 回答
0

搜索完整的错误消息给出了类似的结果: JSON 路径“$.name”处没有值,异常:json 不能为空或为空,使用 Mockmvc 和 Spring-boot

对预期 JSON 响应的假设

创建或更新单个用户时,您会期望单个用户对象作为 JSON 响应 - 而不是数组(具有 10 个用户元素)。

然后你的断言应该检查 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-path 表达式$表示根节点
  • JSON-path$[10]计算为数组的第 11 个元素(从零开始的索引!)(在根处)。
  • JSON-path$.id计算为以对象命名的字段id(在根)

也可以看看:

于 2021-07-26T20:43:11.923 回答