我正在使用 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
为此目的的方法...
最佳答案
我会说这是一个(可用性)错误。仅使用“但是”一词而不是空格,可以使消息更具表现力。
值得指出的是,不匹配消息通常由 JUnit 的 assertThat() 和一些附加词显示:“Expected”(显示 Matcher 描述)、“Actual”(显示不匹配)。这样就更清楚了。
通常,当您使用 allOf() 时,您会有多个匹配器,因此对于不匹配描述来说,说明哪个匹配器失效是很有用的。但我同意信息可以更清晰。
关于java - 奇怪的 AllOf hamcrest 匹配器不匹配描述,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20566668/