我用的是汉克雷斯特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()时,会有多个匹配器,因此,对于不匹配描述来说,指出哪个匹配器坏了是很有用的。但我同意这个信息可能会更清晰。

09-11 19:35
查看更多