Junit Matcher的比较器?

Ehm*_*Kah 11 java junit hamcrest matcher

几天后我正在使用Junit的Matchers功能.一切正常,但我正在寻找一个使用比较器进行比较的匹配器,它不依赖于对象等于方法.

我想替换

Assert.assertThat(one, CoreMatchers.equalTo(two)
Run Code Online (Sandbox Code Playgroud)

与(伪代码)类似的东西

Assert.assertThat(eins, CoreMatchers.equalTo(operand, new MyComparator())
Run Code Online (Sandbox Code Playgroud)

你知道是否有一个简单的开箱即用的解决方案?我没有在谷歌找到一个,也不想写一个.

Nat*_*own 12

现在,Hamcrest 2.0.0.0+支持此功能.

您可以使用org.hamcrest.comparator.ComparatorMatcherBuilder类来实现此目的,例如:

ComparatorMatcherBuilder builder = ComparatorMatcherBuilder.comparedBy(equivalenceComparator);
Assert.assertThat(eins, builder.comparesEqualTo(operand));
Run Code Online (Sandbox Code Playgroud)


Joe*_*Joe 0

我不知道汉克雷斯特有什么可以做到这一点。您可能需要编写一个自定义匹配器。需要考虑的一件事是:如果equals不返回true,则对象是否相等?如果您正在测试特定属性,您的自定义匹配器可能会更清晰FeatureMatcherIs there a simple way to match a field using Hamcrest?)。例如,如果测试针对预期标签:

assertThat(eins, equalToUnderComparison("1", new LabelComparator());
Run Code Online (Sandbox Code Playgroud)

可能更清楚:

assertThat(eins, hasLabel(eq("1")));
Run Code Online (Sandbox Code Playgroud)

编写自定义匹配器不需要大量代码(编写自定义匹配器),如果它使代码更具可读性,则没有理由避免它。