接口测试报错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
相关产品推荐
相关产品推荐

