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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 21:06:04