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

Hamcrest JsonPath匹配Double类型值时测试异常失败求助

排查MockMvc测试Double字段匹配失败的问题

这个问题我之前踩过类似的坑,大概率是浮点数精度匹配导致的断言失败!

问题根源

Java的double类型属于浮点数,在JSON序列化/反序列化过程中,可能会因为底层的精度存储机制,导致实际返回的数值和你写的预期值存在极其微小的差异(比如末尾几位数字变化)。而你用Hamcrest的is()方法做断言时,它会调用equals()做严格的相等比较,这种细微的精度差就会触发断言异常。

解决方案

1. 使用Hamcrest的closeTo()方法(推荐)

这个方法允许你指定一个误差容忍范围,只要实际值在预期值的误差范围内就会通过断言。修改你的测试代码如下:

mockMvc.perform(get("/test"))
    .andExpect(status().isOk())
    .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
    .andExpect(jsonPath("$.latitude", closeTo(-26.733229893125923, 0.0000001)))
    .andExpect(jsonPath("$.longitude", closeTo(-26.733229893125923, 0.0000001)));

注意:第二个参数是误差容忍度,你可以根据业务需求调整(比如地理坐标的话,0.0000001的误差完全可以忽略)。

2. 先确认实际返回的JSON内容

如果还是有问题,可以先打印完整的响应内容,看看序列化后的数值到底是什么样的:

mockMvc.perform(get("/test"))
    .andDo(print()) // 打印响应头、响应体等完整信息
    .andExpect(status().isOk())
    .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
    ...;

通过打印的内容,你可以直观看到latitude和longitude的实际值,再调整预期值或者误差范围。

3. 检查字段序列化的一致性

另外还要确认你的LatLng类的字段是否正确序列化:

  • 确保类中的latitude和longitude字段有对应的getter方法(Spring MVC默认通过getter序列化)
  • 如果用了@JsonProperty注解,要确认注解的名称和JSON中的键完全一致(比如@JsonProperty("latitude"))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:39:20