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。
修复步骤
给UserService的addUser方法打Stub
在测试方法最开头加一行,指定调用这个方法时返回你预设的secondExpectedUserDto:when(userService.addUser(any(User.class))).thenReturn(secondExpectedUserDto);删掉多余的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
相关产品推荐
相关产品推荐

