奇怪的AllOf hamcrest匹配器不匹配的描述

时间:2013-12-13 12:34:15

标签: java junit matcher hamcrest

我正在使用 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方法用于此目的......

1 个答案:

答案 0 :(得分:1)

我会说这是一个(可用性)错误。只需用“但是”这个词代替空格,这个信息可能更具表现力。

值得指出的是,不匹配消息通常由JUnit的assertThat()显示,并带有一些附加词:“Expected”(显示Matcher描述),“Actual”(显示不匹配)。这使它更清晰。

通常当你使用allOf()时,你会有多个匹配器,所以对于不匹配的描述说明哪一个破坏是有用的。但我同意这个信息可以更清楚。