自动检查等值,哈希码和比较到的一致性的技术?

2022-09-02 10:28:55

我很清楚合同需要确保这与 一致,并且与 一致。但是,这在实践中经常被违反。是否有任何工具、技术或库可以自动测试这种一致性?hashCodeequalsequalscompareTo

不幸的是,我怀疑答案是否定的,但是能够对这种可以使用库调用或框架的事情进行单元测试将是有用的,而不是需要为每个重要情况手动编写自定义测试。

如果不清楚我所说的一致性是什么意思,我指的是以下内容:hashCodeequals

如果根据 equals(Object) 方法,两个对象相等,则对两个对象中的每个对象调用 hashCode 方法必须生成相同的整数结果。

对于和我指的是以下内容:equalscompareTo

当且仅当 e1.compareTo(e2) == 0 对于 C 类的每个 e1 和 e2 具有与 e1.equals(e2) 相同的布尔值时,类 C 的自然排序称为与 equals 一致。


答案 1

番石榴的测试有一个名为 EqualsTester 的实用程序,我们将其用作单元测试的日常部分来测试和 .它的用途看起来像equalshashCode

new EqualsTester()
  .addEqualityGroup("hello", "h" + "ello")
  .addEqualityGroup("world", "wor" + "ld")
  .addEqualityGroup(2, 1 + 1)
  .testEquals();

它测试同一组中的所有值是否相等并具有相同的哈希代码,不同的组相等,以及各种其他不变量都得到满足。您可以自己使用它,也可以借用它的想法。

如果可以在不生成或显式指定测试值的情况下进行测试,我会感到非常惊讶,因为这似乎很可能等同于停止问题。


答案 2

如果您使用的是JUnit,则扩展包具有EqualsHashCodeTestCase,它完全测试Java规范中概述的所有内容(自反,传递,对称等)的等于和哈希码。您所要做的就是为父类提供一个相等且不相等的对象,以用于检查。

由于CompanerTo方法是Compable接口的一部分,因此它实际上被拆分为另一个测试用例 - ComparabilityTestCase。这需要三个对象 - 一个是较小值,相等值和较大值的对象。重写这些,父类将负责其余的工作。


推荐