Spring MockMvc测试GET接口返回body为null、JSON Path找不到值如何解决?
问题修复方案
1. 修正请求路径匹配
测试代码中请求路径为/api/person/{Id},但Controller方法仅配置了@GetMapping("/person/{id}"),请先确认Controller类上是否标注了@RequestMapping("/api")前缀:
- 若无该前缀,直接将测试代码中请求路径修改为
get("/person/{id}", 1)即可 - 注意路径变量大小写建议和Controller定义保持一致,避免匹配异常
2. 修正响应返回逻辑
当前Controller直接返回Optional<Person>对象,JSON序列化后会多一层Optional封装结构,直接用$.id无法匹配到Person的属性,推荐修改Controller逻辑,取出Optional中的实体再返回:
@GetMapping("/person/{id}") @ResponseBody public ResponseEntity<Object> getPersonById(@PathVariable Long id) { try { Optional<Person> personOpt = personService.findById(id); if (personOpt.isPresent()) { // 直接返回Person实体,不再封装Optional return new ResponseEntity<>(personOpt.get(), HttpStatus.OK); } return new ResponseEntity<>("对应人员不存在", HttpStatus.NOT_FOUND); } catch (Exception e){ return new ResponseEntity<>(null, HttpStatus.BAD_REQUEST); } }
如果不想修改Controller代码,就需要调整测试中的JSON路径为$.get.id、$.get.firstName,适配Optional的序列化结构。
3. 确认Mock对象初始化正确
测试中你使用Optional.ofNullable(person)封装返回值,如果person对象没有提前初始化赋值,会直接返回Optional.empty,导致响应无有效字段:
在测试执行前添加Person初始化逻辑即可:
// 测试类中添加初始化逻辑 private Person person; @BeforeEach void initTestData() { person = new Person(); person.setId(1L); person.setFirstName("Raghunandan"); person.setLastName("Palakodety"); person.setDob("07.11.1987"); }
4. 检查测试类Mock配置
确认测试类已添加@WebMvcTest(PersonController.class)注解,且personService已通过@MockBean注入测试类,否则你定义的Mock返回规则不会生效,真实调用personService会返回空值。
内容的提问来源于stack exchange,提问作者Raghu Palakodety
相关产品推荐
相关产品推荐

