我用的是汉克雷斯特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
。我的问题是:这是虫子还是我遗漏了什么?
事实上,不同的匹配器返回不同格式的消息是一件大事,因为我试图编写一些使用匹配器的自定义验证框架,如果有任何问题,它能够返回良好的可读消息。看来我不能用这种方法…
最佳答案
我认为这是一个(可用性)缺陷。这个信息可以用“但是”这个词而不是空格来表达。
值得指出的是,不匹配消息通常由JUnit的assertThat()显示,并附加一些单词:“expected”(显示匹配器描述)、“actual”(显示不匹配)。这就更清楚了。
通常,当使用allof()时,会有多个匹配器,因此,对于不匹配描述来说,指出哪个匹配器坏了是很有用的。但我同意这个信息可能会更清晰。