Ответ 1
Сопряжение OrderingComparison:: moreThan будет работать на любом типе, который сопоставим с самим собой (он находится в пакете org.hamcrest.number
, но не на самом деле не зависит от числа), Дата такого типа.
Мне нужно проверить до/после дат в определенном тестовом случае. Я хотел бы использовать совпадения Hamcrest, если это возможно.
Существуют ли какие-либо подходящие средства для Hamcrest (Java) для работы с датами? Если так, в каком пакете/классе я найду конкретные функции сопоставления дат?
Сопряжение OrderingComparison:: moreThan будет работать на любом типе, который сопоставим с самим собой (он находится в пакете org.hamcrest.number
, но не на самом деле не зависит от числа), Дата такого типа.
Существует библиотека совпадений дамб, предоставленных библиотекой в https://github.com/eXparity/hamcrest-date, которая также доступна для maven, ivy и т.д. в
<dependency>
<groupId>org.exparity</groupId>
<artifactId>hamcrest-date</artifactId>
<version>1.1.0</version>
</dependency>
Он поддерживает различные матчи для дат, поэтому позволяет создавать такие конструкции, как
Date myBirthday = new Date();
MatcherAssert.assertThat(myBirthday, DateMatchers.after(Moments.today()));
или
Date myBirthday = new Date();
MatcherAssert.assertThat(myBirthday, DateMatchers.isToday());
Существуют определенные расширения hamcrest, которые могут облегчить некоторые тесты, связанные с датами. Пожалуйста, здесь.
Вы можете посмотреть новые совпадения даты, которые будут добавлены в hamcrest (я не знаю, когда думал):
Обсуждение ответов на вопросники/изменения кода в github
После быстрого просмотра кажется, что появится новый пакет org.hamcrest.date, содержащий:
Matchers#greaterThan
работает с Date
и другими объектами Comparable
.
Здесь вы можете проверить, что ваша дата больше или равна (≥) до некоторой ожидаемой даты:
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.greaterThan;
import static org.hamcrest.core.AnyOf.anyOf;
...
Date expectedMin = new Date()
// Execute the method being tested
Date resultDate = getDate();
// Validate
assertThat(resultDate, anyOf(greaterThan(expectedMin), equalTo(expectedMin)))
Существует также расширение Cirneco. Он имеет несколько спецификаторов Date
(например, monday()
) и другие, которые применяются к датам из-за реализации Comparable
(см., Например, between()
, betweenInclusive()
). Планируется также поддержка Joda Time в версии библиотеки JDK7 и новых классов, основанных на дате, в версии JDK8 (главным образом LocalDate
).
Вы можете делать утверждения типа:
final Date date = new Date();
assertThat(date, is(monday())); // JUnit style
given(date).assertIs(monday()); // Cirneco style
Вы можете использовать следующую зависимость для проекта, совместимого с JDK7:
<dependency>
<groupId>it.ozimov</groupId>
<artifactId>java7-hamcrest-matchers</artifactId>
<version>0.7.0</version>
</dependency>
или следующее, если вы используете JDK8
<dependency>
<groupId>it.ozimov</groupId>
<artifactId>java8-hamcrest-matchers</artifactId>
<version>0.7.0</version>
</dependency>
https://assertj.github.io/doc/#assertj-core-recursive-comparison
org.assertj: assertj-ядро: 3.12.2
assertThat(actual)
.usingRecursiveComparison()
.ignoringFieldsMatchingRegexes("fieldToIgore")
.isEqualTo(expected);