You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:24:04