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来说也是新的。我必须对此进行更多的调查。现在,我想我将坚持覆盖等于。