【发布时间】:2018-02-17 10:17:48
【问题描述】:
似乎 groovy 匹配器找不到相等的浮点值。我正在做的是确保响应正文中有一个包含精确值的映射。
这里是代码
Float purchaseAmount = (Float) ((Map) travelSharedData.bookingPackage.get("total")).get("amount");
response.then().body(String.format("response.cashbacks.find() {it.purchaseAmount.amount == %.2f}", purchaseAmount), is(notNullValue()));
JSON
{
"response": {
"cashbacks": [
{
"date": "09-08-2017T12:56:39.000Z",
"purchaseAmount": {
"amount": 4963.91,
"currency": "USD"
},
"cashbackAmount": {
"amount": 99.28,
"currency": "USD"
},
"description": "Tulip House Boutique Hotel Bratislava",
"estimatedAvailable": "10-28-2017T00:00:00.000Z",
"status": "pending",
"eventType": "transaction"
}
]}}
错误
java.lang.AssertionError: 1 expectation failed.
JSON path response.cashbacks.find() {it.purchaseAmount.amount == 4963.91 && it.description == 'Tulip House Boutique Hotel Bratislava'} doesn't match.
Expected: is not null
Actual: null
当然我可以转换值,但我想知道它为什么会失败。
【问题讨论】:
-
与浮点数的精确比较非常脆弱,因为它们本质上是不精确的。对于单精度浮点数尤其如此。为我试一试:用
it.purchaseAmount.amount > 4963.90 && it.purchaseAmount.amount < 4963.92替换相等比较,看看你是否得到结果。这将有助于确定您的查询是浮点问题还是更基本的问题。
标签: java groovy rest-assured