AssertJ: быстрые тесты заказа с пользовательским компаратором - PullRequest
1 голос
/ 23 апреля 2019

Давайте предположим, что у меня есть класс Foo, который не реализует Comparable, и класс FooComparator, который реализует Comparator<Foo>.

Использование языка AssertJAPI, я бы сейчас предположил, что я мог бы сделать что-то вроде этого:

Foo foo1 = ...;
Foo foo2 = ...;
FooComparator fooComparator = ...;
assertThat(foo1).usingComparator(fooComparator).isGreaterThan(foo2);

Поскольку Foo не реализует Comparable, assertThat(foo1) вернет тип ObjectAssert<Foo> и, поскольку usingComparator также возвращаетObjectAssert<Foo>, у меня нет доступа к методам isGreaterThan и isLessThan, которые объявлены в интерфейсе ComparableAssert.

Существует ли причина, по которой ObjectAssert<Foo>.usingComparator 'only' возвращает ObjectAssert<Foo> а не ComparableAssert<Foo>?

Конечно, я могу переписать вышеупомянутое утверждение чем-то вроде assertThat(fooComparator.compare(foo1, foo2)).isGreaterThan(0), но само выражение не особенно читаемо, и в случае сбоев генерируется сообщение ( 'Ожидается: <-1> больше, чем: <0>' ) не упоминает фактические данные в foo1 и foo2, вызывающие сбой подтверждения.

Есть ли способ бегловыразить это условие с помощью встроенного API AssertJ без необходимости реализацииСобственные расширения или обертки?

1 Ответ

0 голосов
/ 24 апреля 2019

В настоящее время вы не можете вернуть ComparableAssert<Foo> после usingComparator, потому что AbstractComparableAssert требует, чтобы фактический тип Foo был Comparable.AbstractComparableAssert объявлено так:

AbstractComparableAssert<SELF extends AbstractComparableAssert<SELF, ACTUAL>,
                         ACTUAL extends Comparable<? super ACTUAL>>

Я не уверен, поможет ли это, но я все равно упомяну, вы можете написать:

assertThat(asList(foo1, foo2)).isSortedAccordingTo(fooComparator);
...