AssertJ:使用自定义比较器进行流畅的订购测试

时间:2019-04-23 12:20:40

标签: java assertj

让我们假设我有一个类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接口中声明的isLessThanComparableAssert方法。

ObjectAssert<Foo>.usingComparator'仅'返回ObjectAssert<Foo>而不返回ComparableAssert<Foo>的原因吗?

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

是否有一种方法可以使用内置的AssertJ API流畅地表达这种条件,而不必实现专有的扩展或包装?

1 个答案:

答案 0 :(得分:0)

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

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

我不确定这是否有帮助,但是无论如何我都会提到,您可以这样写:

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