java - AssertJ:使用自定义比较器进行流畅的排序测试

标签 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> ,我无权访问 isGreaterThanisLessThan方法,在 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成为ComparableAbstractComparableAssert声明如下:

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/

相关文章:

java - 将 GeoJson 转换为 mapbox Polygon 对象 (Android)

java - ColdFusion JVM : strange memory behaviour

java - PowerMockito 正在调用真实方法而不是模拟私有(private)方法

java - 从数组加载下一个 Twitter 用户并使用 blogger.js 获取他们的推文

java - AssertJ本地构建时没有这样的方法错误

java - 如何借助 Assertj 检查该框架不包含带有特定文本的 jlabel?

java - AssertJ 无法在没有规模的情况下断言 BigDecimal 相等

java - 在 JUnit 测试(java)中如何使用 Assertj 库检查数组的数组?

java - 将Jsch放入连接池详解

kotlin - 如何使用带有通用接口(interface)和其他参数的构造函数在 Kotlin 中创建对象