2013-12-13 4 views
3

Я использую hamcrest 1.3. Его реализация matches(Object o, Description mismatch) выглядит следующим образом:Strange 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

Я бы сказал, что это ошибка (удобство использования). Сообщение может быть более выразительным просто со словом «но» вместо пространства.

Следует отметить, что сообщения о несоответствиях обычно отображаются с помощью утверждения assertThat() от JUnit с некоторыми дополнительными словами: «Ожидаемое» (показывает описание Matcher), «Фактическое» (показывает несоответствие). Это делает его более ясным.

Обычно, когда вы используете allOf(), у вас должно быть несколько совпадений, поэтому полезно, чтобы описание несоответствия указывало, какой из них был сломан. Но я согласен, что сообщение может быть более четким.

Смежные вопросы