根据目前的消息来源:
infix fun Double.shouldBe(other: Double): Unit = ToleranceMatcher(other, 0.0).test(this)
ToleranceMatcher
在哪里
class ToleranceMatcher(val expected: Double, val tolerance: Double) : Matcher<Double> {
override fun test(value: Double) {
if (tolerance == 0.0)
println("[WARN] When comparing doubles consider using tolerance, eg: a shouldBe b plusOrMinus c")
val diff = Math.abs(value - expected)
if (diff > tolerance)
throw AssertionError("$value is not equal to $expected")
}
infix fun plusOrMinus(tolerance: Double): ToleranceMatcher = ToleranceMatcher(expected, tolerance)
}
因此,匹配d shouldBe e
将完全比较双打而没有任何容差(a - b
永远不会给出0
不同的双打)并打印警告:
[警告] 比较双打时考虑使用容差,例如:a shouldBe b plusOrMinus c
而exactly(d)
定义为
fun exactly(d: Double): Matcher<Double> = object : Matcher<Double> {
override fun test(value: Double) {
if (value != d)
throw AssertionError("$value is not equal to expected value $d")
}
}
这样它就会做同样的事情,尽管没有任何警告。
我想,这个警告的意思是鼓励开发人员明确指定双精度数是精确比较的,或者指定容差,因为即使以不同的顺序完成相同的算术也可能会产生不同的双精度数结果。