2013-12-13 38 views
3

我正在使用hamcrest 1.3。其實現的matches(Object o, Description mismatch)看起來像這樣:奇怪AllOf Hamcrest匹配器不匹配說明

@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

我想說這是一個(可用性)的錯誤。這個信息可以更簡單地用「but」而不是空格來表達。值得指出的是,不匹配的消息通常由JUnit的assertThat()和一些額外的單詞顯示:「Expected」(顯示Matcher描述),「Actual」(顯示不匹配)。這使得它更清晰。

通常,當您使用allOf()時,您會有多個匹配器,因此對於不匹配的描述來說說哪一個匹配器是有用的。但我同意這個信息可能會更清楚。