
AssertJ 默认使用 equals() 进行值比较,但可通过 isSameAs() 和 isNotSameAs() 方法实现符合语义的引用相等性断言,获得清晰的错误提示和一致的 API 风格。
assertj 默认使用 equals() 进行值比较,但可通过 issameas() 和 isnotsameas() 方法实现符合语义的引用相等性断言,获得清晰的错误提示和一致的 api 风格。
在单元测试中,当需要验证两个引用是否指向同一个对象实例(即内存地址相同),而非内容相等时,必须避免依赖 isEqualTo() —— 它始终调用 equals(),可能因重写逻辑导致误判。AssertJ 提供了专为此场景设计的语义明确、错误友好的断言方法:isSameAs() 与 isNotSameAs()。
✅ 正确用法(Kotlin):
assertThat(obj1).isSameAs(obj2) // 断言 obj1 === obj2 assertThat(obj1).isNotSameAs(obj3) // 断言 obj1 !== obj3
✅ 正确用法(Java):
assertThat(obj1).isSameAs(obj2); // 断言 obj1 == obj2 assertThat(obj1).isNotSameAs(obj3); // 断言 obj1 != obj3
这些方法底层直接使用 ==(Java)或 ===(Kotlin)进行比较,并在失败时自动生成可读性强的错误消息,例如:
Expecting: <com.example.user> to be the same instance as: <com.example.user> but was not.</com.example.user></com.example.user>
这比手动写 assertThat(obj1 == obj2).isTrue() 的泛化失败信息(如 "expected: <true> but was: <false>"</false></true>)更具诊断价值。
⚠️ 注意事项:
-
isSameAs(null)是合法的,可用于断言对象为null(即assertThat(obj).isSameAs(null)),但更推荐语义更清晰的isNull(); - 不要将
isSameAs()用于基本类型(如int,boolean),它仅适用于引用类型; - 若需同时校验非空与引用相等,可链式调用:
assertThat(obj1).isNotNull().isSameAs(obj2)。
总结:isSameAs() 是 AssertJ 中进行引用比较的标准、惯用且推荐的方式——它保持了 API 一致性,强化了测试意图表达,并显著提升了断言失败时的调试效率。










