首页 > 解决方案 > 为什么 assertJ 中的 FieldByFieldComparator 不起作用?

问题描述

在将两个 JavaBeans 元素列表与 BigDecimals 字段进行比较时,我尝试使用 AssertJ 中的 FieldByFieldComparator,但它不起作用。当我使用默认的 BigDecimal 比较器比较这两个 BigDecimal(例如 1.00 和 1.000000)时,断言不会失败(因为通过比较它们是相等的)。

我还编写了自己的 BeansFieldByFieldComparator,它可以工作,但我想知道是否有必要,因为 AssertJ 中包含这样的比较器,也许我以错误的方式使用它?但一切都表明我是对的——它不起作用。

JavaBean 代码:

@Value
public static class Foo {
    BigDecimal bar;
}

无效的断言:

assertThat(asList(new Foo(new BigDecimal("1.000"))))
.usingFieldByFieldElementComparator()
.containsOnlyElementsOf(asList(new Foo(new BigDecimal("1.0000000"))));

为什么 FieldByFieldComparator 不起作用?在此先感谢您的帮助:)

标签: javacomparatorbigdecimalassertj

解决方案


原因是它使用BigDecimal equals方法来比较bar字段并且BigDecimal 的等号区分2.02.00usingFieldByFieldElementComparator javadoc 说明字段与 比较equals

为了让您的断言通过,您可以指定断言应如何与 进行比较BigDecimalusingComparatorForType例如:

assertThat(asList(new Foo(new BigDecimal("1.000"))))
         .usingFieldByFieldElementComparator()
         .usingComparatorForType(BIG_DECIMAL_COMPARATOR, BigDecimal.class)
         .containsOnlyElementsOf(asList(new Foo(new BigDecimal("1.0000000"))));

其中BIG_DECIMAL_COMPARATORComparator<BigDecimal>通过调用 BigDecimal 的compareTo方法实现的,请参见org.assertj.core.util.BigDecimalComparator.


推荐阅读