如何使用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
相关产品推荐
相关产品推荐

