在Java中测试相等性

时间:2016-11-05 00:25:01

标签: java junit

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

@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;
}

1 个答案:

答案 0 :(得分:3)

  

如何在Java中使用equals方法?

你叫它!

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

面对面,您编写的代码大多是正确的。像你所做的那样捕捉和挤压Exception是不好的做法,而且可能在语义上不正确。 可以隐藏您问题的真正原因;例如在一次现场比较中出现意料之外的NPE。

您评论道:

  

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

可能,是的!

equals的正确行为可能会允许任何未预料到的未经检查的异常传播。比较缺少字段的不完整Bill对象可能是不正确的。如果代码旨在处理(即null字段),那么您应该使用null测试来避免NPE。

(我认为将null字段视为导致equals返回false是不合理的。如果您将Bill与{{{}}进行比较怎么办?例如,1}}字段对抗自身。)

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

最后,正如@ a-sir指出的那样,如果你覆盖Bill,你应该(技术上)覆盖equals。如果您使用hashCode作为Bill中的关键字或HashMap的元素,则会发生错误的事情...并且该类与HashSet和{{不兼容1}}方法。