简而言之,hashCode契约,根据Java的object.hashCode():
让我们主要关注不可变数据对象 - 它们的信息在构造之后永远不会改变,因此假定#1成立.留下#2:问题只是确认等于隐含代码==.
显然,我们无法测试每个可想到的数据对象,除非该集合很小.那么,编写可能会遇到常见情况的单元测试的最佳方法是什么?
由于此类的实例是不可变的,因此构造此类对象的方法有限; 如果可能的话,这个单元测试应该涵盖所有这些.在我的脑海中,入口点是构造函数,反序列化和子类的构造函数(应该可以简化为构造函数调用问题).
[我打算通过研究来回答我自己的问题.来自其他StackOverflowers的输入是这个过程的一个受欢迎的安全机制.]
[这可能适用于其他OO语言,所以我添加了该标签.]
如何在单元测试中测试 hashCode()函数?
public int hashCode(){
int result = 17 + hashDouble(re);
result = 31 * result + hashDouble(im);
return result;
}
Run Code Online (Sandbox Code Playgroud) 我很清楚的合同需求,确保hashCode与一致equals,并且equals与一致compareTo.但是,这在实践中经常被违反.是否有可以自动测试此一致性的工具,技术或库?
我怀疑不幸的是答案是"不",但能够对这种可以利用库调用或框架的东西进行单元测试而不是需要手动编写自定义测试是有用的.每个重要的案例.
如果目前还不清楚我所说的一致意思是,hashCode和equals我指的是以下几点:
如果两个对象根据equals(Object)方法相等,则对两个对象中的每一个调用hashCode方法必须生成相同的整数结果.
对于equals和compareTo我指的是以下几点:
当且仅当e1.compareTo(e2)== 0具有与c的每个e1和e2的e1.equals(e2)相同的布尔值时,C类的自然排序被认为与equals一致.