Junit assertEquals比较对象id而不是对象的内容?

Junit assertEquals比较对象id而不是对象的内容?,junit,junit4,Junit,Junit4,我想测试我的insert方法。insert方法只是将对象添加到列表中。然而,当我使用assertEquals时,它似乎在比较对象,而不是对象的内容 是否有方法比较存储在ArrayList中的用户定义对象的元素 @Test public void testInsert() { // Method answer Interval newInterval = new Interval(1, 20); ArrayList<Interval> emptyInterval

我想测试我的
insert
方法。
insert
方法只是将对象添加到列表中。然而,当我使用
assertEquals
时,它似乎在比较对象,而不是对象的内容

是否有方法比较存储在ArrayList中的用户定义对象的元素

@Test
public void testInsert() {
    // Method answer
    Interval newInterval = new Interval(1, 20);
    ArrayList<Interval> emptyInterval = new ArrayList<Interval>();
    ArrayList<Interval> returnedAnswer = Solution.insert(emptyInterval, newInterval);

    // Expected answer
    ArrayList<Interval> expected = new ArrayList<Interval>();
    //expected.add(newInterval); // This will pass
    expected.add(new Interval(1, 20)); // This will fail

    assertEquals(expected, returnedAnswer);
}
@测试
公共无效测试集(){
//方法答案
区间newInterval=新区间(1,20);
ArrayList emptyInterval=新建ArrayList();
ArrayList returnedAnswer=Solution.insert(emptyInterval,newInterval);
//预期答案
应为ArrayList=新的ArrayList();
//应为。add(newInterval);//这将通过
应为。添加(新间隔(1,20));//此操作将失败
资产质量(预期、返回的回答);
}

assertEquals
通过调用对象的
equals
方法来测试对象的相等性。这意味着对象必须具有该方法的充分实现。看起来
Interval
没有它。因此,您必须实现
Interval.equals(Object)

如果不想覆盖
等于
,可以使用匹配器。但您也需要库的
reflectEquals
匹配器

assertThat(returnedAnswer, contains(
  reflectsEquals(new Interval(1, 20))));

可能提供了类似的断言,但您必须自己寻找,因为我很少使用AssertJ。

太好了!实现了我自己的
Interval.equals(Object)
,工作起来很有魅力。但是,还有其他方法吗?因为如果我有很多用户定义的类,那么覆盖每个类的
euqals
将非常麻烦。我扩展了我的答案。谢谢Stefan的帮助。我以前没有用过Hamcrest,对JUnit来说也是新的。我必须对此进行更多的调查。现在,我想我将坚持覆盖
等于