java - 为什么 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 不起作用?在此先感谢您的帮助:)
解决方案
原因是它使用BigDecimal
equals
方法来比较bar
字段并且BigDecimal 的等号区分2.0
(2.00
usingFieldByFieldElementComparator javadoc 说明字段与 比较)equals
。
为了让您的断言通过,您可以指定断言应如何与 进行比较BigDecimal
,usingComparatorForType
例如:
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_COMPARATOR
是Comparator<BigDecimal>
通过调用 BigDecimal 的compareTo
方法实现的,请参见org.assertj.core.util.BigDecimalComparator
.
推荐阅读
- python - 将字典中的一些值相乘
- python - TypeError("'_io.TextIOWrapper' 对象不可调用")
- javascript - Firebase 在登录后注销用户
- node.js - node.js String.split() 如果在引号之间,则忽略分隔符
- c++ - 在子矩阵上找到逐行最大值的最快方法
- javascript - Firebase firestore 应用程序 - 使用网络调用是一种好习惯吗?暴露 apiKey 可以让别人让你有额外的账单吗?
- gradle - 如何将 checkstyle 添加到 libGDX 项目?
- c# - ASP.NET Core 2.2 - 问题详情
- java - FirefoxBinary 类型的 startProfile(FirefoxProfile, File, String) 未定义
- wxwidgets - 与 PyCollapsiblePane 一起使用时,ScrolledWindow 不显示 scollbars