让我们假设我有一个类Foo
和一个Comparable
类,它实现了FooComparator
,而该类实现了Comparator<Foo>
。
使用AssertJ的流畅API,我现在假设我可以做这样的事情:
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
'仅'返回ObjectAssert<Foo>
而不返回ComparableAssert<Foo>
的原因吗?
我当然可以用assertThat(fooComparator.compare(foo1, foo2)).isGreaterThan(0)
的行来重写上面的断言,但是表达式本身不是特别可读,并且在失败的情况下,生成的消息('Expecting:<-1 >大于:<0>')没有提及foo1和foo2中的实际数据,导致断言失败。
是否有一种方法可以使用内置的AssertJ API流畅地表达这种条件,而不必实现专有的扩展或包装?
答案 0 :(得分:0)
目前,您无法在ComparableAssert<Foo>
之后返回usingComparator
,因为AbstractComparableAssert
要求实际类型Foo
为Comparable
。 AbstractComparableAssert
的声明如下:
AbstractComparableAssert<SELF extends AbstractComparableAssert<SELF, ACTUAL>,
ACTUAL extends Comparable<? super ACTUAL>>
我不确定这是否有帮助,但是无论如何我都会提到,您可以这样写:
assertThat(asList(foo1, foo2)).isSortedAccordingTo(fooComparator);