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

标签 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为此目的的方法...

最佳答案

我会说这是一个(可用性)错误。仅使用“但是”一词而不是空格,可以使消息更具表现力。

值得指出的是,不匹配消息通常由 JUnit 的 assertThat() 和一些附加词显示:“Expected”(显示 Matcher 描述)、“Actual”(显示不匹配)。这样就更清楚了。

通常,当您使用 allOf() 时,您会有多个匹配器,因此对于不匹配描述来说,说明哪个匹配器失效是很有用的。但我同意信息可以更清晰。

关于java - 奇怪的 AllOf hamcrest 匹配器不匹配描述,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20566668/

相关文章:

java - 为什么@Value 作为构造函数的参数正确填充属性?

JAVAFX/WebView/WebEngine FireBugLite 或其他一些调试器?

java - 缩短排序列表

java - 对于接受类似类型的输入参数、相同的实现代码但不同的输出的测试用例,正确的实现是什么

c# - 将一项测试应用于两个不同的类(class)

java - 如何在Java应用程序中获取机器上的SID列表

java - Gradle环境下JUnit测试访问文件

java.util.regex.Matcher.replaceAll 替换不匹配?

Java Scanner vs Matcher——正则表达式,Matcher 有效,Scanner 无效

java - 正则表达式替换java中查询参数中的值