如何使两个对象等于传递assertEquals()?

时间:2014-09-08 06:37:22

标签: java junit

所以我有这段代码:

Item i = new Item(ID, TITLE, DESCRIPTION) { };
Item i2 = new Item(ID, "", "") { };
assertEquals("Item(id=1)", i.toString());
assertEquals("Item(id=1)", i2.toString());
assertNotSame(i, i2);
assertEquals(i, i2);
assertThat(0, not(equalTo(i.compareTo(i2))));

Item i3 = new Item(BigInteger.TEN, "", "") { };
assertEquals("Item(id=10)", i3.toString());
assertNotSame(i, i3);
assertThat(i, not(equalTo(i3)));

还提供:

@Override
public final int compareTo(final Item o) {
    int c = o.title.compareTo(title);
    if (c == 0) {
        c = o.id.compareTo(id);
    }
    return c;
}

它通过assertNotSame(i, i2);但在assertEquals(i, i2);失败我试图覆盖toString()方法,但这没有帮助。实际上写的是Item(id=1)是预期的,它确切地Item(id=1),但仍然存在问题。

我看到其他线程中的建议覆盖了equals方法,但实际上并不知道如何做到这一点。

4 个答案:

答案 0 :(得分:3)

您需要覆盖equals(Object)方法:

@Override
public boolean equals (Object o) {
    if (!o instanceof Item) {
        return false;
    }
    Item other = (Item)o;
    return getId().equals(other.getId()) &&
           getTitle().equals(other.getTitle()) &&
           getDescription().equals(other.getDescription());
}

为了不违反Java关于equals(Object)hashCode()的合同,您还需要覆盖它。 e.g:

@Override
public int hashCode() {
    final int prime = 31;
    result = prime * result + getId().hashCode();
    result = prime * result + getTitle().hashCode();
    result = prime * result + getDescription().hashCode();
    return result;
}

注意:假设您的所有成员都不是null,这些都是天真的实现。

答案 1 :(得分:1)

您需要实现Object.equals方法来提供有意义的相等性测试,即使用对象的属性。另外,最佳实践规定你还应该实现hashCode(),这在使用你的对象作为HashMap中的键正确行为时通常是必需的

我看到你实现了java.lang.Comparable,这通常只用于允许使用Collections.sort进行排序。

遗憾的是,Assert.assertEquals的Javadoc没有提及新Java程序员的Object.equals()。

答案 2 :(得分:0)

你应该重写equals方法。 (还有hashCode)

答案 3 :(得分:-1)

感谢您的回答。实际上我只需要生成equals()hashode()方法,以便在此时仅包含id字段。我选择了我的构造函数Source>生成hashCode()和equals()...