You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

接口测试报错java.lang.AssertionError: JSON路径$.id无值求助

排查JSON路径断言失败:java.lang.AssertionError: No value at JSON path "$.id"

服务器测试时持续触发错误java.lang.AssertionError: No value at JSON path "$.id",下方是测试代码与AuthController代码,同类逻辑的其他代码未出现该问题,以下是核心排查方向:

测试代码

@Test
public void registerSuccessful() throws Exception {
    User testUser1 = new User("test.com", "password", "John", "Doe", "JDoe");
    testUser1.setId(1);
    given(authService.register(testUser1)).willReturn(testUser1);

    String requestBody = objectMapper.writeValueAsString(testUser1);
    this.mockMvc.perform(post("/auth/register")
                    .contentType(MediaType.APPLICATION_JSON)
                    .content(requestBody))
            .andExpect(status().is(201)).andDo(print())
            .andExpect(MockMvcResultMatchers.jsonPath("$.id", is(1)))
            .andExpect(jsonPath("$.email", is("test.com")))
            .andExpect(jsonPath("$.password", is(testUser1.getPassword())))
            .andExpect(jsonPath("$.firstName", is(testUser1.getFirstName())))
            .andExpect(jsonPath("$.lastName", is(testUser1.getLastName())))
            .andExpect(jsonPath("$.username", is(testUser1.getUsername())))
            .andExpect(jsonPath("$.imageUrl", is(testUser1.getImageUrl())));
}

AuthController代码

@PostMapping("/register")
public ResponseEntity<User> register(@RequestBody RegisterRequest registerRequest) {
    User created = new User(
            registerRequest.getEmail(),
            registerRequest.getPassword(),
            registerRequest.getFirstName(),
            registerRequest.getLastName(),
            registerRequest.getUsername());

    return ResponseEntity.status(HttpStatus.CREATED).body(authService.register(created));
}

核心排查点

  • 检查User类的序列化规则:确认id字段未被@JsonIgnore注解排除,且存在对应的getId()方法(Jackson默认通过getter方法序列化字段);同时检查类上是否有@JsonInclude等限制序列化的注解,确保非空/有值的id会被输出。
  • 核对请求体与接收对象的字段匹配:测试用User生成请求体,但Controller接收的是RegisterRequest——若RegisterRequest没有id字段,请求体中的id会被忽略,Controller创建的created对象id为默认值(如0或null);即使mock的authService返回带id=1的对象,也要确认该对象的id能正常被序列化输出。
  • 查看MockMvc打印的响应内容:测试中的.andDo(print())会输出完整响应,直接检查返回的JSON里是否存在id字段。如果响应里没有id,问题出在序列化或返回对象构造;如果有id,检查JSON Path的大小写是否匹配(比如字段实际是Id而非id)。
  • 验证Mock的匹配逻辑:given(authService.register(testUser1)).willReturn(testUser1)中,Controller传入authService的是自己创建的created对象,而非测试代码中的testUser1。若User类未正确重写equals()和hashCode(),Mock会匹配失败,导致authService返回默认值(如null),进而响应中无id。
  • 检查全局Jackson配置:确认是否存在全局配置忽略某些类型字段,或对数字类型序列化有特殊处理,导致id字段未被正确输出。

内容的提问来源于stack exchange,提问作者David Macias Mata

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 17:15:42