2017-10-18 252 views
5

放心usage documentation各地拥有的例子是这样的:混淆了放心浮点数比较

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

好了,他们用的是Hamcrest匹配器来比较int值5

但是他们有一节说,放心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一起工作吗?

回答

1

我不知道我是正确本文中的100%,但这个帖子成了太长评论...

从阅读文档的HamcrestREST Assured好像equalTo只有在返回true案件Object.equals返回true:

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

因此由于放心表示浮点值作为浮筒,并且Double.equals只能返回true,如果该另一对象是Double,有必要使用一个float而不是double(作为输入将得到盒装入一个东西)。

另外,彩车得放心文档的部分似乎表明它仅适用于浮点值:

浮点数必须使用Java“浮动”原始进行比较。

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

如果您选择使用Matchers.closeTo,而不是equalTois(其本身调用equalTo),那么如果使用doublefloat它不应该的问题。

+0

你的答案是最接近实际回答我的问题,虽然你的一些答案不是权威。你提出的最重要的一点是,如果我使用'Matcher.closeTo()'(这就是我们应该使用的东西),它可能并不重要什么JSON解析器输出。 –

0

你可以将很多东西与hamcrest的equalTo进行比较。匹配器,它的使用还处于测试断言:

assertThat(longValue, equalTo(10L)); 
assertThat(cadena, equalTo("Esta es una cadena")); 

有龙和字符串比较,当然,你有Batman蝙蝠侠比较的东西,如双打或BigDecimal的,看看herethere

所以确实是正常的惊喜,但你也可以选择比较或做方便时等于

0

看起来你是混合在一起的两件事。

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

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

所以5以上是如何工作,这是一个int而不是一个双?

假设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))) 

希望它有帮助。

0

如果你仔细阅读Hamcrest那么你会发现,它明确规定“当检查对象在逻辑上等于指定的操作数”为equalTo。所以显然不管它是“5”还是5!在Rest-Assured中提到equalTo和hasItems是Hamcrest匹配器,您应该从org.hamcrest.Matchers静态导入。所以我不认为应该有任何混淆。