【问题标题】:AssertJ fails to assert BigDecimal equality without scaleAssertJ 无法断言没有比例的 BigDecimal 相等
【发布时间】:2020-09-02 23:09:10
【问题描述】:

我正在运行这样的断言:

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

我得到了

期待: 等于:

然后我尝试了

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

期待: 等于:

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

【问题讨论】:

标签: java junit assertj


【解决方案1】:

您可以使用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));

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

【讨论】:

  • 这正是isEqualByComparingTo 断言可用的原因。
  • 虽然在比较迭代与用元组提取时失败:(
  • @Kango_V 您可以使用usingComparatorForType 来断言Iterables 和extracting。我已经用一个例子更新了答案。
  • 完美运行!
【解决方案2】:

试试java.math.BigDecimal.stripTrailingZeros()方法,像这样:

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

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

【讨论】:

  • 为什么这个答案得了负分??
  • 我不知道,似乎在大多数情况下都有效;但是您忘记了工程符号:stripTrailingZeros()BigDecimal("1E+2") != BigDecimal("100") 没有帮助。
猜你喜欢
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多