如何以惯用方式强制AssertJ按对象身份进行比较?
AssertJ如何按对象身份(引用)进行断言?
AssertJ的assertThat(...).isEqualTo()默认用.equals()做内容比较,这通常是合理选择,但有时候我们需要严格按对象身份/引用地址来判断(对应Java的==、Kotlin的===),有没有AssertJ原生的惯用写法实现这种比较?
当前临时方案的问题
目前能想到的临时办法是直接用语言本身的身份比较运算符,再用AssertJ断言布尔结果,但这个方案有两个明显缺点:
- 和其他AssertJ链式断言的风格不统一
- 断言失败时,错误信息仅显示“预期为true,实际为false”,无法展示两个对象的具体信息(哪怕它们只是内存地址不同、内容完全一致)
临时方案代码:
Kotlin代码
assertThat(obj1 === obj2).isTrue()
Java代码
assertThat(obj1 == obj2).isTrue();
推荐的AssertJ原生写法
AssertJ其实提供了专门用于对象身份断言的方法:
isSameAs(expected):断言实际对象和预期对象是同一个内存引用(等价于==/===)isNotSameAs(expected):断言实际对象和预期对象不是同一个内存引用
对应的示例代码:
Kotlin代码
assertThat(obj1).isSameAs(obj2)
Java代码
assertThat(obj1).isSameAs(obj2);
这个写法的优势很明显:
- 完全符合AssertJ的链式断言风格,和其他断言代码保持一致
- 断言失败时会输出清晰的错误信息,比如展示两个对象的
toString()结果以及身份差异,能快速定位问题
内容的提问来源于stack exchange,提问作者sh-at-cs
相关产品推荐
相关产品推荐

