对REST的困惑确保浮点比较

时间:2017-10-18 16:35:04

标签: java json floating-point rest-assured

REST Assured usage documentation有这样的例子:

get("/lotto").then().body("lotto.lottoId", equalTo(5));

好的,所以他们使用Hamcrest匹配器来比较int值5

但是他们有一节说默认使用REST Assured JSON解析器使用float而不是double,所以我应该与12.12进行比较而不是12.12f。 :

get("/price").then().body("price", is(12.12f));

等等,那么5如何在上面工作,int而不是double? JSON解析器是否对整数和非整数值使用不同的基元?

但它变得更加混乱。精通程序员知道你不应该直接比较浮点值(因为存储浮点值的方法很复杂等)。相反,您应该使用提供误差范围的Matchers.closeTo(double operand, double error)。这是正确的方法。但是等等---即使我将12.12f传递给Matchers.closeTo(双操作数,双错误),是不是仍然要将它转换为double?这可以与REST Assured一起使用吗?

4 个答案:

答案 0 :(得分:1)

我不是100%肯定我在这里是正确的,但是这个帖子对于评论来说太长了......

通过阅读HamcrestREST Assured的文档,似乎equalTo仅在Object.equals返回true的情况下返回true:

  

[equalTo]创建一个匹配器,该匹配器在被检查对象在逻辑上等于指定的操作数时匹配,通过在被检查对象上调用Object.equals(java.lang.Object)方法来确定。

因此,由于REST Assured将浮点值表示为浮点数,而Double.equals只能返回true,如果该另一个对象是Double,则必须使用float而不是double(因为输入将被装入一个对象)。

此外,REST Assured文档中的浮动部分似乎表明它仅适用于浮点值:

  

必须将浮点数与Java" float"进行比较。原语。

我认为这意味着整数被正确表示为整数。 (文档中的其他示例似乎也暗示了这一点)

如果您选择使用Matchers.closeTo代替equalTois(其本身称为equalTo),那么如果您使用{double,则无关紧要{1}}或float

答案 1 :(得分:0)

你可以将很多东西与hamcrest.Matchers相提并论,它也用于测试中的断言:

t1[ t1$pylons %in% head( unique(t1$pylons) ,5), ]

与Long和String进行比较,当然,你有closeTo来比较诸如double或bigdecimal之类的东西,看看herethere

确实,这是一个意外的惊喜,但你也可以选择比较或在方便的时候做等于

答案 2 :(得分:0)

看起来你要把两件事混在一起。

  

JSON解析器是否对整数使用不同的基元   非整数值?

值比较由给定的匹配器对象完成。无论如何,给定的匹配器对Json Parser没有任何影响。无论您给匹配器(第一个示例中为5)赋予什么值以及给定jsonpath返回什么值,等于匹配器(org.hamcrest.core.IsEqual)通过调用Objects.equals()方法来比较两个值。 Json解析器也可以使用值对象而不使用基元。

  

那么5如何在上面工作,这是一个int而不是一个double?

假设JsonPath lotto.lottoId将返回int值,因此body("lotto.lottoId", equalTo(5));将为真(显然json值必须为5

12.2' and 12.2f'在您的示例中被视为相同的值。你的例子中的后缀“f”是多余的,没有任何效果。由于方法closeTo(double, double)已将参数类型定义为double,因此传递的float值将隐式提升为double类型。

因为你知道你的json的值会加倍,所以你可以将你的断言表达为:

get("/price").then().body("price", closeTo(12.12, 0.01));

根据Json解析器配置,非整数值可以读作BigDecimal,如果是这种情况,您可以使用closeTo()的方差作为

.get("/price").then().body("price", 
           closeTo(BigDecimal.valueOf(12.12), BigDecimal.valueOf(0.01)))

希望它有所帮助。

答案 3 :(得分:0)

如果您仔细阅读了Hamcrest,那么您会发现,当被检查对象在逻辑上等于指定的操作数"时,会清楚地说明" equalTo 。所以很明显,无论是" 5"还是5!在Rest-Assured中的ANd,提到 equalTo和hasItems是Hamcrest匹配器,你应该从org.hamcrest.Matchers静态导入。所以我不认为应该有任何混淆