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

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

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

如果我不清楚我的一致性是什么意思,对于hashCodeequals ,请参考以下内容:

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

对于equalscompareTo我参考以下内容:

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

Guava的测试有一个名为EqualsTester的实用程序,我们将其用作unit testing的日常部分来测试equalshashCode 。 它的用途看起来像

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

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

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

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

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

我编写了一些实用工具方法来帮助unit testinghashCode和equals方法:

http://softsmithy.sourceforge.net/devlib/docs/api/org/softsmithy/devlib/junit/Tests.html

该库是开源的,可以从这里下载: http : //sourceforge.net/projects/softsmithy/files/softsmithy-devlib/v0.1/

或与Maven:

   org.softsmithy.devlib devlib-core 0.1 test  

有一个非常酷的工具叫做Korat ,可以进行详尽的搜索,以检查小类的Java类的正确性。 它实际上是查看为了构建程序可以实际区分的给定大小的所有不同测试用例而执行的代码。 我不知道它在大型情况下有多大用处,但对于许多程序,它可以用来自动检查这样的情况是否正常工作。

希望这可以帮助!

我最近使用meanbean(http://meanbean.sourceforge.net/)自动测试equals()和hashCode()契约的类(加上setter / getter对)。

“卑鄙的豆子:

1.测试JavaBean / POJO的getter和setter方法对是否正确运行。

2.validation类的equals和hashCode方法是否分别符合Equals Contract和HashCode Contract。

3.validation对象平等中的属性重要性。“

我仍然有很多特定于meanbean的问题:它是否validation了equals()和hashCode()的一致性。 另外,我没有努力打败它。 我相信它不支持compareTo()。 而我还没有尝试过替代方案。 对其他人的体验感兴趣。