让我们假设我有一个不实现Foo的类Comparable和一个实现FooComparatorComparator<Foo>类。

现在使用AssertJ的流畅API,我可以做这样的事情:

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


由于Foo未实现Comparable,因此assertThat(foo1)将返回ObjectAssert<Foo>类型,并且usingComparator还返回ObjectAssert<Foo>,因此我无法访问已声明的isGreaterThanisLessThan方法。在ComparableAssert界面中。

为什么ObjectAssert<Foo>.usingComparator'only'返回ObjectAssert<Foo>而不是ComparableAssert<Foo>有原因吗?

我当然可以用assertThat(fooComparator.compare(foo1, foo2)).isGreaterThan(0)的行重写上面的断言,但是表达式本身不是特别可读,并且在失败的情况下,生成的消息(“期望:大于:')没有提及foo1和foo2中导致断言失败的实际数据。

有没有一种方法可以使用内置的AssertJ API流畅地表达这种情况,而无需实现专有的扩展或包装?

最佳答案

目前,您无法在ComparableAssert<Foo>之后返回usingComparator,因为AbstractComparableAssert要求实际类型FooComparableAbstractComparableAssert的声明如下:

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/

10-09 08:15