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

RestAssured中匹配BigDecimal类型1.0应使用哪种Hamcrest匹配器?

解决RestAssured中BigDecimal与Double的断言匹配问题

这个问题我之前也踩过坑!核心原因是Hamcrest的is()匹配器会做严格的类型检查:你断言里写的1.0是Double类型,但因为DTO里的字段是BigDecimal,RestAssured解析JSON后得到的实际值是BigDecimal类型。虽然数值显示都是1.0,但Java中不同数值类型的equals()判断会返回false,所以才抛出了这个看似矛盾的断言错误。

下面给你几种靠谱的解决方案:

方案1:用BigDecimal实例作为期望值

直接构造与DTO类型一致的BigDecimal对象作为断言的期望值,这样类型和数值都能精准匹配:

.body("entity.value", is(new BigDecimal("1.0")));

或者用BigDecimal.valueOf()来构造,效果完全相同:

.body("entity.value", equalTo(BigDecimal.valueOf(1.0)));

(注:is()其实是equalTo()的语法糖,两者功能没有区别)

方案2:用BigDecimal专属的数值比较匹配器

如果担心精度问题,或者想更明确地处理BigDecimal的数值比较,可以用Hamcrest提供的comparesEqualTo()匹配器——它会调用BigDecimal的compareTo()方法,只判断数值是否相等,不严格要求对象完全一致:

import static org.hamcrest.Matchers.comparesEqualTo;

.body("entity.value", comparesEqualTo(new BigDecimal("1.0")));

方案3:指定提取值的类型(不推荐,仅作补充)

你也可以在断言时明确指定JSON路径值的转换类型,让RestAssured自动把提取到的值转为Double,再和你的期望值比较:

.body("entity.value", is(1.0), Double.class);

不过这种方式不够严谨,如果DTO的BigDecimal有更高精度的数值,转换为Double可能会丢失精度,所以更推荐前两种方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:29:46