繁体   English   中英

用Java测试相等性

[英]Testing for equality in Java

您如何在Java中使用equals方法? 在JUnit中,我正在通过断言它们是否相等来测试初始化​​为相等的两个值是否相同,但是我的测试失败了。 我确保检查传入的对象是否是另一个对象的实例,但是我不确定为什么测试失败。

@Test
public void testEqualityOnBillSimple()
{
    Date d1 = new Date( 3,4,2020);
    Money m1 = new Money(10);
    Bill b1 = new Bill( m1, d1, "fred");
    Bill b2 = new Bill( m1, d1, "fred");

    assertTrue( b1.equals(b2));
}

public boolean equals (Object toCompare) {
    try {
        if (toCompare instanceof Bill) {
            Bill that = (Bill) toCompare;
            return this.amount.equals(that.amount) && 
            this.dueDate.equals(that.dueDate) && 
           this.paidDate.equals(that.paidDate) && 
            this.originator.equals(that.originator);
        }
    } catch (Exception e) {
    }
    return false;
}

您如何在Java中使用equals方法?

你叫!


您真正想知道的是为什么测试失败。 这归结于如何正确实现equals(Object) 通常,答案是它取决于(整个)对象的预期语义。

从表面上看,您编写的代码基本上是正确的。 捕获和压缩Exception是一种不好的做法,在语义上可能不正确。 可能隐藏了问题的真正原因; 例如,在现场比较之一中出现了意外的NPE。

您评论了:

我意识到这很成问题,但是现在对我的代码有影响吗?

可能是的!

正确的行为是“ equals ,可能允许任何意外的未经检查的异常传播。 比较具有缺失字段的不完整Bill对象可以说是不正确的。 如果代码旨在解决该问题(即null字段),则应使用null测试来避免使用NPE。

(我认为将null字段视为导致equals返回false是没有意义的。例如,如果将具有null字段的Bill与自身进行比较,该怎么办。)

为了完全确定没有其他问题,我们需要查看Bill类的其余实施情况。


最后,正如@ a-sir所指出的,如果您覆盖equals ,则(在技术上)也应覆盖hashCode 如果您在Bill HashMapHashSet的元素中使用Bill作为键,并且类具有不兼容的equalshashCode方法,则将发生不好的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM