Является org.junit.Assert.assertThat лучше, чем org.hamcrest.MatcherAssert.assertThat?

Я новичок в JUnit и Hamcrest и хотел бы получить советы по лучшей практике, поэтому я могу решить, какую документацию нужно изучить в первую очередь.

Для начала, какой из этих методов assertThat лучше?

  • org.junit.Assert.assertThat(от junit-4.11.jar)
  • org.hamcrest.MatcherAssert.assertThat(от hamcrest-core-1.3.jar)

По словам одного человека в прошлом году, JUnit имеет метод assertThat, но hamcrest имеет свой собственный метод assertThat, который делает то же самое..

По словам кого-то ранее в этом году, Hamcrest "мог бы дать лучшие сообщения об ошибках, потому что вызывающий вызов вызван для описания несоответствия" .

Трудно сказать, какие версии Junit и Hamcrest сравнивались в этих сообщениях. Поэтому мне нужна рекомендация, основанная на самых последних выпущенных версиях.

Ответ 1

Это почти то же самое.

Последние версии JUnit теперь включают hamcrest.

Infact org.junit.Assert.assertЭта подпись метода

public static <T> void assertThat(T actual,
                              org.hamcrest.Matcher<T> matcher)

который вы заметите, использует сочетания hamcrest.

Вы все еще можете включить свою собственную версию hamcrest becuase. JUnit не обновляется очень часто и может не всегда использовать последнюю версию hamcrest.

Согласно maven pom, В JUnit 4.11 используется hamcrest 1.3, который, по моему мнению, является самым актуальным на момент написания этой статьи.

ИЗМЕНИТЬ Я только что прочитал вашу вторую статью http://blog.code-cop.org/2014/02/assert-or-matcherassert.html и описывает 2 незначительных отличия в hamcrest assertThat, которые делают его более полезным:

  • когда совпадение не выполняется, сообщение об ошибке включает в себя то, что было другим, а не "ожидаемым X, но было Y". пользовательские сопоставления hamcrest могут включать более подробную информацию о том, что именно было неправильно, реализовав describeMismatch()
  • Подпись assertThat отличается в hamcrest с использованием T actual, Matcher<? super T> matcher, которая позволяет суперподразделениям быть супер-типами (например, Matcher для сравнения целых чисел и парных чисел). Обычно это не имеет значения, но когда вам это нужно, это хорошая функция.

Поэтому используйте org.hamcrest.MatcherAssert.assertThat

Ответ 2

Отрывок из Руководство пользователя JUnit 5:

Однако класс JUnit Jupiters org.junit.jupiter.Assertions не предоставляет метод assertThat(), подобный тому, который найден в классе JUnit 4s org.junit.Assert, который принимает Hamcrest Matcher. Вместо этого разработчикам рекомендуется использовать встроенную поддержку для сопоставлений, предоставляемых сторонними библиотеками утверждений.

Я думаю, что для JUnit 4, Hamcrest assertThat (официально) предпочтительнее.