Я использую библиотеку AssertJ для выполнения утверждений в моем тесте. В этом случае я хочу проверить, находится ли каждый Date
объект в списке после другой даты.
Поэтому я, очевидно, могу сделать следующее:
Date dateOne = new Date(someTimestamp);
Date dateTwo = new Date(otherTimestamp);
Assertions.assertThat(dateOne).isAfter(dateTwo);
Нет вопросов по этому поводу.
Но что, если я захочу проверить каждый элемент списка, чтобы убедиться, что все они указаны после указанной даты.
Date dateOne = new Date(someTimestamp);
Date dateTwo = new Date(otherTimestamp);
Date dateThree = new Date(fooBarTimestamp);
List<Date> dates = Arrays.asList(dateOne, dateTwo);
//and here I want to make sure that all Dates in dates are after dateThree
Я справился с этим, создав пользовательский org.assertj.core.api.Condition
и использовал следующий синтаксис:
Assertions.assertThat(dates).is(allAfterDate(dateThree));
но компаратор выглядит очень аккуратно, и, что самое важное, мой SonarQube жалуется, что эта подпись:
Condition<List<? extends Date>> allAfterDate(final Date dateToCompare) {...}
ломает универсальные c типы подстановочных знаков должны не должен использоваться в возвращаемых параметрах rule. Я склонен верить в SonarQube, если я не уверен, что это правило, которое я могу нарушить в этот раз. И я не уверен.
Мне нравится использовать SoftAssertions
, поэтому обходной путь будет использовать:
SoftAssertions assertions = new SoftAssertions();
dates.forEach( date -> {
assertions.assertThat(date).isAfter(dateThree);
});
assertions.assertAll();
Но я просто не могу чувствовать, что это возможно использовать этот крутой AssertJ синтаксис, который большинству разработчиков так нравится; -)
Есть ли способ, которым я могу сделать что-то похожее на это?
Assertions.assertThat(dates).everySingleElement().isAfter(dateThree);
И если это невозможно, что будет лучшим и самый чистый способ сделать это?
(И я знаю, что могу подавить сонар с помощью //NOSONAR
, я просто не хочу)