让我们假设我有一个不实现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
'only'返回ObjectAssert<Foo>
而不是ComparableAssert<Foo>
有原因吗?我当然可以用
assertThat(fooComparator.compare(foo1, foo2)).isGreaterThan(0)
的行重写上面的断言,但是表达式本身不是特别可读,并且在失败的情况下,生成的消息(“期望:大于:')没有提及foo1和foo2中导致断言失败的实际数据。有没有一种方法可以使用内置的AssertJ API流畅地表达这种情况,而无需实现专有的扩展或包装?
最佳答案
目前,您无法在ComparableAssert<Foo>
之后返回usingComparator
,因为AbstractComparableAssert
要求实际类型Foo
为Comparable
。 AbstractComparableAssert
的声明如下:
AbstractComparableAssert<SELF extends AbstractComparableAssert<SELF, ACTUAL>,
ACTUAL extends Comparable<? super ACTUAL>>
我不确定这是否有帮助,但是无论如何我都会提到,您可以这样写:
assertThat(asList(foo1, foo2)).isSortedAccordingTo(fooComparator);
关于java - AssertJ:使用自定义比较器进行流畅的订购测试,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55811121/