自动检查equals,hashCode和compareTo的一致性的技巧?

Mic*_*wan 19 java unit-testing equals hashcode compareto

我很清楚的合同需求,确保hashCode与一致equals,并且equals与一致compareTo.但是,这在实践中经常被违反.是否有可以自动测试此一致性的工具,技术或库?

我怀疑不幸的是答案是"不",但能够对这种可以利用库调用或框架的东西进行单元测试而不是需要手动编写自定义测试是有用的.每个重要的案例.

如果目前还不清楚我所说的一致意思是,hashCodeequals我指的是以下几点:

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

对于equalscompareTo我指的是以下几点:

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

Lou*_*man 12

Guava的测试有一个实用工具EqualsTester,我们将其用作我们测试equals和测试的单元测试的日常部分hashCode.它的用途看起来像

new EqualsTester()
  .addEqualityGroup("hello", "h" + "ello")
  .addEqualityGroup("world", "wor" + "ld")
  .addEqualityGroup(2, 1 + 1)
  .testEquals();
Run Code Online (Sandbox Code Playgroud)

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

如果可以在不生成或明确指定测试值的情况下进行测试,我会非常惊讶,因为这似乎可能等同于暂停问题.


jos*_*ain 5

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

由于CompareTo方法是Comparable接口的一部分,因此它实际上分为另一个测试用例--ComparabilityTestCase.这需要三个对象 - 一个较小的值,相等的值和更大的值.覆盖这些,父类将负责其余的事情.