我正在尝试对产生BigDecimal输出的某些方法进行单元测试,但是我对变化的前提感到很困惑:
assertEquals(BigDecimal.valueOf(20), result);
我最近从使用构造函数(new BigDecimal(value)
创建BigDecimal值切换为使用valueOf(value)
),而我的测试却在抱怨:
Expected :20
Actual :20.00
设置BigDecimal.valueOf(20.00)
并没有帮助,所以我的问题是,测试这些浮点BigDecimal实例的正确方法是什么?我的大多数测试用例在浮点之后都为零。
答案 0 :(得分:5)
问题在于BigDecimal.equals
遵循以下规则:
将此
BigDecimal
与指定的Object
比较是否相等。 与compareTo
不同,此方法考虑两个BigDecimal
对象 仅当它们的值和标度相等时才相等(因此2.0不相等) 以此方法比较时为2.00)。
20
和20.00
的比例尺不同。
您需要使用其中一个
new BigDecimal("20.00")
或
BigDecimal.valueOf(20).setScale(2)
或者,如果您喜欢更多深奥的选择
BigDecimal.valueof(2000, 2)
BigDecimal.valueOf(20.00)
的问题在于,遵循BigDecimal.valueOf(double)
的规则,这会导致20.0
的BigDecimal(即小数位数1),并且-略有不同-{{1 }}将产生new BigDecimal(20.00)
的{{1}}(小数位数为0)。
答案 1 :(得分:2)
除技术性new BigDecimal("20.00")
以外,
new BigDecimal(20.00)
(由于触发了“字符串解析”的“”),建议您考虑一下hamcrest。
当您需要测试“平等+增量”时,该框架甚至可以提供BigDecimalCloseTo,以供使用:
assertThat(new BigDecimal("1.03"), is(closeTo(new BigDecimal("1.0"), new BigDecimal("0.03"))))