BlueJ中单元测试失败但BicomplexNumber的equals判断成立的问题
问题排查:JUnit assertEquals失败但自定义equals返回true的原因
这问题我之前踩过坑,根源出在equals方法的定义方式不对上,咱们来理清楚:
核心问题:你写的是重载的equals,不是重写Object的equals
Java里的Object类自带的equals方法签名是public boolean equals(Object obj),但你写的equals方法参数是BicomplexNumber类型——这属于重载(Overload),也就是你新创建了一个方法,并没有覆盖掉父类Object的equals方法。
而JUnit的assertEquals方法底层是调用的Object.equals(),默认行为是比较两个对象的内存引用,所以即使你直接调用b1.equals(b2)(此时调用的是你自定义的那个重载方法)返回true,JUnit还是会因为引用不同判定两个对象不相等。
修复步骤
1. 正确重写Object的equals方法
把方法参数改成Object类型,加上@Override注解(编译器会帮你校验是否正确重写),内部先做类型检查再比较字段:
@Override public boolean equals(Object obj) { // 引用相同直接返回true if (obj == this) { return true; } // 若为null或类型不匹配,返回false if (!(obj instanceof BicomplexNumber)) { return false; } // 强制类型转换 BicomplexNumber other = (BicomplexNumber) obj; // 逐一比较所有字段(补充你没写完的第四个字段,比如getD()) return other.getA() == this.getA() && other.getB() == this.getB() && other.getC() == this.getC() && other.getD() == this.getD(); }
2. 配套重写hashCode方法(必做)
根据Java语言规范:如果两个对象通过equals()返回true,那么它们的hashCode()必须返回相同的值。否则会导致HashMap、HashSet等集合类出现异常行为。可以用Objects.hash()快速实现:
import java.util.Objects; @Override public int hashCode() { return Objects.hash(getA(), getB(), getC(), getD()); }
改完之后再跑JUnit测试,应该就能正常通过了。
内容的提问来源于stack exchange,提问作者ipro_ultra
相关产品推荐
相关产品推荐

