【发布时间】:2010-09-16 08:13:14
【问题描述】:
简而言之,hashCode合约,根据Java的object.hashCode():
- 除非影响 equals() 的内容发生更改,否则哈希码不应更改
- equals() 表示哈希码是 ==
让我们假设主要对不可变数据对象感兴趣 - 它们的信息在构造后永远不会改变,因此假设 #1 成立。剩下#2:问题只是确认equals意味着哈希码==。
显然,我们无法测试所有可能的数据对象,除非该集合非常小。那么,编写可能捕获常见情况的单元测试的最佳方法是什么?
由于此类的实例是不可变的,因此构造此类对象的方法有限;如果可能,此单元测试应涵盖所有这些。在我的脑海中,入口点是子类的构造函数、反序列化和构造函数(应该可以归结为构造函数调用问题)。
[我将尝试通过研究来回答我自己的问题。来自其他 StackOverflowers 的输入是此过程中受欢迎的安全机制。]
[这可能适用于其他 OO 语言,所以我添加了该标签。]
【问题讨论】:
-
我通常发现由于实现了equals或hashcode,合同已经破裂,但不是两者兼而有之。 openpojo 在 Java 项目中有帮助。 EqualsAndHashCodeMatchRule 对此有所帮助。已经存在的答案提供了有关测试合同其余部分的足够详细信息。
标签: java unit-testing oop