AssertJ 无法在没有规模的情况下断言 BigDecimal 相等

夢のの*_*のの夢 2 java junit assertj

我正在运行这样的断言:

assertThat(obj.getTotal()).isEqualTo(BigDecimal.valueOf(4))
Run Code Online (Sandbox Code Playgroud)

我正进入(状态

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

所以我试过了

assertThat(obj.getTotal()).isEqualTo(BigDecimal.valueOf(4.00))
Run Code Online (Sandbox Code Playgroud)

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

我找到了一种解决方法,在该方法中我将预期值的比例设置44.00,但我必须为测试中的所有 BigDecimal 变量这样做似乎很令人恼火。AssertJ 有没有我不知道的更好的方法?

Mar*_*amy 7

您可以使用isEqualByComparingTo或比较实际数值的usingComparator使用BigDecimal.compareToequals默认 assertj 使用的方法根据JavaDoc执行以下操作:

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

所以你可以这样做:

    assertThat(obj.getTotal())
        .usingComparator(BigDecimal::compareTo)
        .isEqualTo(BigDecimal.valueOf(4.00));
Run Code Online (Sandbox Code Playgroud)

或者干脆:

assertThat(obj.getTotal())
    .isEqualByComparingTo(BigDecimal.valueOf(4.00));
Run Code Online (Sandbox Code Playgroud)

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")));
Run Code Online (Sandbox Code Playgroud)

  • 从 3.20.0 开始,比较将不再使用通过以下方式设置的任何比较器:“usingComparatorForType(Comparator, Class)”。等价的是:`usingRecursiveFieldByFieldElementComparator(RecursiveComparisonConfiguration.builder().withComparatorForType(BigDecimal::compareTo, BigDecimal.class).build())` (3认同)
  • 这正是“isEqualByComparingTo”断言可用的原因。 (2认同)