几天来,我一直在使用Junit的Matchers功能,一切都正常,但我正在寻找一个使用比较器进行比较的匹配器,它不依赖于对象等于方法。
我想替换
Assert.assertThat(one, CoreMatchers.equalTo(two)
使用类似于(伪代码)的内容
Assert.assertThat(eins, CoreMatchers.equalTo(operand, new MyComparator())
你知道是否存在一个简单的开箱即用的解决方案吗?我没有在谷歌找到一个,也不想写一个。
5条答案
按热度按时间ss2ws0br1#
现在Hamcrest www.example.com +中支持此功能2.0.0.0。
您可以使用org.hamcrest.comparator.ComparatorMatcherBuilder类别来达成此目的,例如:
wlzqhblo2#
我在hamcrest 1.3中遇到了同样的问题,通过编写一个匹配器解决了这个问题,这个匹配器遵循IsEqual-Matcher的代码,但是使用了一个给定的比较器而不是Object#equals()。
owfi6suc3#
另一个选择是使用AspectJ框架为对象和可迭代对象定制比较策略。
它还具有逐字段比较,例如isEqualToComparingOnlyGivenFields和isEqualToIgnoringGivenFields比较器。
因此,在大多数情况下,无需自定义比较策略即可处理Assert
fafcakar4#
我不知道Hamcrest中有什么东西可以做到这一点。您可能需要编写一个自定义匹配器。需要考虑的一件事是:如果
equals
没有返回true
,那么对象是否相等?如果要测试特定的属性,自定义匹配器可能更清楚地表示为FeatureMatcher
(Is there a simple way to match a field using Hamcrest?)。例如,如果测试的是预期标签:可能更清楚:
编写自定义匹配器并不需要很多代码(编写自定义匹配器),如果它使代码更可读,就没有理由避免它。
vmjh9lq95#
我偶然发现了
verify()
方法的相同用例。决定实现一个自定义的ArgumentMatcher
,它在比较之前简单地复制所有不感兴趣的类属性。