我正在使用 hamcrest 1.3 。 matches(Object o, Description mismatch)
的实现看起来像这样:
@Override
public boolean matches(Object o, Description mismatch) {
for (Matcher<? super T> matcher : matchers) {
if (!matcher.matches(o)) {
mismatch.appendDescriptionOf(matcher).appendText(" ");
matcher.describeMismatch(o, mismatch);
return false;
}
}
return true;
}
当描述不匹配时,它首先附加失败的匹配器的描述,然后才是实际的不匹配。这导致一些非常奇怪的消息。
例如,如果我写:
Description description = new StringDescription();
allOf(lessThan(2)).describeMismatch(5, description);
System.out.println(description.toString());
然后在控制台上打印a value less than <2> <5> was greater than <2>
。我希望只有<5> was greater than <2>
,因为这是其他匹配者返回的那种信息,例如lessThan
单独使用。
我的问题是:这是一个错误还是我错过了什么?
不同的匹配器以不同的格式返回消息的事实是一个大问题,因为我试图编写一些使用匹配器的自定义验证框架,并且如果出现任何问题,它能够返回漂亮的人类可读消息。我似乎无法将describeMismatch
方法用于此目的......
答案 0 :(得分:1)
我会说这是一个(可用性)错误。只需用“但是”这个词代替空格,这个信息可能更具表现力。
值得指出的是,不匹配消息通常由JUnit的assertThat()显示,并带有一些附加词:“Expected”(显示Matcher描述),“Actual”(显示不匹配)。这使它更清晰。
通常当你使用allOf()时,你会有多个匹配器,所以对于不匹配的描述说明哪一个破坏是有用的。但我同意这个信息可以更清楚。