假设我有一个类 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)
这样的东西重写上面的断言。 ,但表达式本身不是特别可读,并且在失败的情况下,生成的消息('期望:<-1> 大于:<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/