如何使用JUnit和Hamcrest比较double?

ecbunoof  于 2023-10-20  发布在  其他
关注(0)|答案(4)|浏览(121)

我正在使用JUnit和Hamcrest编写一个单元测试。我一直在使用双精度值进行比较:

assertThat(result, is(0.5));

但是,我现在需要比较计算值,我不想必须与完整的double值进行比较。相反,我想比较亲密度。
我发现了一个名为IsCloseTo的类,但我不确定如何在assertThat中使用它,而且我在网上找不到任何示例。
什么是正确的语法来做类似下面的事情?

// I can't do this as I need to know what methods/classes whatever I should be using
// isCloseTo doesn't exist.
assertThat(result, isCloseTo(0.5, 0.1));
np8igboo

np8igboo1#

您应该可以调用Matchers.closeTo(double, double)。使用静态导入,它看起来像:

assertThat(result, closeTo(0.5, 0.1));
g52tjvyc

g52tjvyc2#

你可以让这个读起来更好,如果你使用

assertThat(actual, is(closeTo(expected, delta)));

import static org.hamcrest.Matchers.closeTo;
import static org.hamcrest.Matchers.is;
ippsafx7

ippsafx73#

刚刚计算出来,is实际上返回了一个Is对象,所以我需要做的就是:

assertThat(result, new IsCloseTo(0.5, 0.1));

尼克的回答更好。

nfs0ujit

nfs0ujit4#

一个好的方法是使用closeTo()匹配器(正如其他人所指出的那样),使用Math.ulp()来产生错误值。What should be the epsilon value when performing double value equal comparison更多讨论我打开了Hamcrest Issue #402,请求将此功能添加到Hamcrest中,作为一个更简单的closeTo()方法,自动计算错误值。

相关问题