You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以惯用方式强制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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 18:29:55