在MockMvc中如何将JsonPath提取的值与响应头的值做对比?
Spring MockMvc 跨响应头与响应体等值断言方案
Spring 官方 MockMvc DSL 没有提供专门针对该场景的内置断言表达式,你可以通过以下两种方式实现需求:
方式1:流式自定义ResultMatcher(最常用)
直接在andExpect中传入自定义匹配逻辑,写法流畅不打断测试链:
import org.springframework.http.HttpHeaders; import org.springframework.test.util.JsonPathUtils; import static org.junit.jupiter.api.Assertions.assertEquals; // 测试代码中直接使用 mockMvc.perform(post("/your/api/path") .contentType(MediaType.APPLICATION_JSON) .content(yourRequestBody)) .andExpect(status().isCreated()) // 自定义匹配逻辑 .andExpect(result -> { String locationHeader = result.getResponse().getHeader(HttpHeaders.LOCATION); String bodySelfHref = JsonPathUtils.read(result.getResponse().getContentAsString(), "$.data.links.self.href"); assertEquals(locationHeader, bodySelfHref, "Location响应头与响应体self链接值不匹配"); });
如果多场景需要复用该逻辑,可以封装为公共工具方法,使用体验和内置DSL完全一致:
// 封装到测试公共工具类 public static ResultMatcher locationEqualsSelfHref() { return result -> { String location = result.getResponse().getHeader(HttpHeaders.LOCATION); String selfHref = JsonPathUtils.read(result.getResponse().getContentAsString(), "$.data.links.self.href"); assertEquals(location, selfHref, "Location响应头与响应体self链接值不匹配"); }; } // 测试时直接调用 .andExpect(locationEqualsSelfHref())
方式2:先取响应头再断言JSON字段
如果你不想写自定义匹配逻辑,也可以先拿到请求执行结果提取Location值,再用JsonPath断言:
MvcResult mvcResult = mockMvc.perform(post("/your/api/path") .contentType(MediaType.APPLICATION_JSON) .content(yourRequestBody)) .andExpect(status().isCreated()) .andReturn(); // 提取Location头的值 String expectLocation = mvcResult.getResponse().getHeader(HttpHeaders.LOCATION); // 用提取的值做JsonPath断言 mockMvc.perform(asyncDispatch(mvcResult)) // 异步接口需要加这行,同步接口可直接对mvcResult做断言 .andExpect(jsonPath("$.data.links.self.href", equalTo(expectLocation)));
内容的提问来源于stack exchange,提问作者chrylis -cautiouslyoptimistic-
相关产品推荐
相关产品推荐

