首页 > 解决方案 > AssertJ 无法断言没有比例的 BigDecimal 相等

问题描述

我正在运行这样的断言:

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

我正进入(状态

期望:<4.00> 等于:<4>

所以我尝试了

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

期望:<4.00> 等于:<4.0>

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

标签: javajunitassertj

解决方案


您可以使用isEqualByComparingToor usingComparatorthat useBigDecimal.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));

使用 withIterableextracting断言:

    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")));

推荐阅读