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

JUnit5测试Controller返回UserDto时出现JSON路径断言错误

问题解决:返回UserDto时JUnit测试JSON路径断言失败

先看你遇到的异常核心:

java.lang.AssertionError: No value at JSON path "$.email".
Caused by: java.lang.IllegalArgumentException: json can not be null or empty

这说明接口返回的响应体是空的,根本没有JSON内容,所以jsonPath找不到任何字段。

问题根源

你用@MockBean把UserService给Mock了,但没给userService.addUser(user)这个方法指定返回值。Mock对象默认会返回null,所以Controller里调用userService.addUser(user)得到的是null,最终返回的ResponseEntity的body就是null,响应体自然是空字符串,触发了异常。

你贴的UserService代码里只有addUsers方法,但Controller明确调用了addUser方法,所以必须在测试中给这个方法打Stub。

修复步骤

  1. 给UserService的addUser方法打Stub
    在测试方法最开头加一行,指定调用这个方法时返回你预设的secondExpectedUserDto:

    when(userService.addUser(any(User.class))).thenReturn(secondExpectedUserDto);
    
  2. 删掉多余的ModelMapper Mock
    你之前加的ModelMapper相关配置完全没必要,因为我们直接Mock了Service的返回值,不需要管Service内部怎么转对象。把测试类里的@MockBean private ModelMapper modelMapper;和测试方法里的ModelMapper代码都删掉就行。

修改后的测试方法:

@Test
void addUser_Returns_CREATED_user() throws Exception {
    // 关键:Mock Service方法的返回值
    when(userService.addUser(any(User.class))).thenReturn(secondExpectedUserDto);

    mvcResult = mockMvc.perform(post("/users")
            .content(jacksonTester.write(secondExpectedUser).getJson())
            .contentType(MediaType.APPLICATION_JSON))
            .andExpect(status().isCreated())
            .andExpect(jsonPath("$.email").value(secondExpectedUserDto.getEmail()))
            .andReturn();

    String actualUserJson = mvcResult.getResponse().getContentAsString();
    assertThat(actualUserJson).isNotEmpty();
}

额外调试技巧

要是还出问题,可以在测试里打印响应体看看:

String response = mvcResult.getResponse().getContentAsString();
System.out.println("接口返回内容:" + response);

这样能直接看到返回的是空还是格式不对,方便排查。

内容的提问来源于stack exchange,提问作者Andreea Badea

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:34:57