AssertJ无法断言BigDecimal相等而没有规模

问题描述

我正在运行这样的断言:

assertthat(obj.getTotal()).isEqualTo(BigDecimal.valueOf(4))

我得到了

预期: 等于:

所以我尝试了

assertthat(obj.getTotal()).isEqualTo(BigDecimal.valueOf(4.00))

预期: 等于:

我找到了一种解决方法,可以将期望值4的范围设置为4.00,但是对于测试中的所有BigDecimal变量都必须这样做,这似乎很令人讨厌。我不知道AssertJ有更好的方法吗?

解决方法

您可以使用isEqualByComparingTousingComparator,它们使用BigDecimal.compareTo比较实际数值。 assertj默认使用的equals方法根据JavaDoc执行以下操作:

与compareTo不同,此方法仅在两个BigDecimal对象的值和比例相等时才认为它们相等(因此,使用此方法进行比较时,2.0不等于2.00)。

因此您可以这样做:

    assertThat(obj.getTotal())
        .usingComparator(BigDecimal::compareTo)
        .isEqualTo(BigDecimal.valueOf(4.00));

或简单地:

assertThat(obj.getTotal())
    .isEqualByComparingTo(BigDecimal.valueOf(4.00));
,

尝试使用java.math.BigDecimal.stripTrailingZeros()方法,如下所示:

// AssertJ
assertThat(obj.getTotal().stripTrailingZeros()).isEqualTo(BigDecimal.valueOf(4));

// Junit
assertEquals(BigDecimal.valueOf(4),obj.getTotal().stripTrailingZeros());