【问题标题】:Rest Assured: Groovy matcher doesn't match JSON float放心:Groovy 匹配器不匹配 JSON 浮点数
【发布时间】: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


【解决方案1】:

正如 @mike-strobel 解释的那样,groovy 无法找到它,因为 float 本质上是不精确的。

一种解决方法是将相等比较替换为下一个代码:

Float purchaseAmount = (Float) ((Map) travelSharedData.bookingPackage.get("total")).get("amount");
Float lowerBound = purchaseAmount - 0.01f;
Float upperBound = purchaseAmount + 0.01f;
response.then().body(String.format("response.cashbacks.find() {it.purchaseAmount.amount > %.2f && it.purchaseAmount.amount < %.2f}", lowerBound, upperBound), is(notNullValue()));

这里也有很好的解释:What's wrong with using == to compare floats in Java?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 2015-10-30
    • 2015-03-17
    • 2017-11-25
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    相关资源
    最近更新 更多