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

如何使用MockMvcTester提取并验证多个JSON路径?

MockMvcTester多JSON路径验证问题解决方案

问题场景

我正尝试将现有的MockMvc测试改造为使用新的MockMvcTester。

原MockMvc测试代码:

mockMvc.perform(get("/api/persons"))
        .andExpect(status().isOk())
        .andExpect(jsonPath("$.*", hasSize(1)))
        .andExpect(jsonPath("$.[0].name").value("guillaume"))
        .andExpect(jsonPath("$.[0].firstname").value("dupont"));  

我尝试用MockMvcTester实现等效验证,但第二次调用extractingPath时无法编译:

assertThat(mockMvcTester.get().uri("/api/persons"))
                .hasStatusOk()
                .bodyJson()
                .extractingPath("$.[0].name")
                    .isEqualTo("guillaume")
                .extractingPath("$.[0].firstname") // 此处编译失败
                    .isEqualTo("dupont");

问题原因

extractingPath方法调用后,返回的是针对当前路径值的断言实例,而非原有的JSON Body断言上下文,因此无法直接链式调用下一个extractingPath。

解决方案

有两种常用的正确写法:

方式一:在bodyJson的Lambda回调中用and()连接断言

通过Lambda表达式传入bodyJson,在回调内部用and()串联多个extractingPath验证,保持在JSON Body断言上下文里:

assertThat(mockMvcTester.get().uri("/api/persons"))
        .hasStatusOk()
        .bodyJson(jsonBody -> jsonBody
                // 验证数组长度,对应原测试的hasSize(1)
                .extractingPath("$").asList().hasSize(1)
                .and()
                .extractingPath("$.[0].name").isEqualTo("guillaume")
                .and()
                .extractingPath("$.[0].firstname").isEqualTo("dupont")
        );

方式二:先获取JSON Body断言引用,再分别验证

先将bodyJson()的返回值赋值给变量,再对该变量多次调用extractingPath,这种写法更直观:

// 先获取响应的JSON Body断言实例
var jsonBodyAssert = assertThat(mockMvcTester.get().uri("/api/persons"))
        .hasStatusOk()
        .bodyJson();

// 分别验证多个JSON路径
jsonBodyAssert.extractingPath("$.[0].name").isEqualTo("guillaume");
jsonBodyAssert.extractingPath("$.[0].firstname").isEqualTo("dupont");
// 补充验证数组长度
jsonBodyAssert.extractingPath("$").asList().hasSize(1);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 01:05:03