AssertJ 无法断言没有比例的 BigDecimal 相等性

AssertJ fails to assert BigDecimal equality without scale

我是这样运行断言的:

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

我得到

Expecting: <4.00> to be equal to: <4>

然后我尝试了

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

Expecting: <4.00> to be equal to: <4.0>

我找到了一个解决方法,我将期望值的比例 4 设置为 4.00,但我必须对测试中的所有 BigDecimal 变量都这样做似乎很烦人。有没有我不知道的 AssertJ 更好的方法?

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

Unlike compareTo, this method considers two BigDecimal objects equal only if they are equal in value and scale (thus 2.0 is not equal to 2.00 when compared by this method).

所以你可以这样做:

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

或简单地:

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

Iterableextracting 断言一起使用:

    assertThat(asList(new Trade("1", new BigDecimal("5.200")), new Trade("2", new BigDecimal("4.00"))))
        .extracting(Trade::getId, Trade::getAmount)
        .usingComparatorForType(BigDecimal::compareTo, BigDecimal.class)
        .usingRecursiveFieldByFieldElementComparator()
        .containsExactlyInAnyOrder(tuple("1", new BigDecimal("5.2")), tuple("2", new BigDecimal("4")));

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

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

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