我有一种情况,我想知道给定的ArrayList
与另一个ArrayList
是否是不同的对象,即使它们在列表中都包含相同的对象也是如此。我正在测试包含ArrayList
的父对象的某些复制逻辑,并且我想确保此处的未来开发人员不要在逻辑期间简单地重新分配数组列表。
例如,如果我有一个Model
类,它包含一个ArrayList
属性,该属性包含名为Integer
的{{1}}个对象,我想这样做:
values
应该证明我们正在复制// Create the original value
Model model1 = ...
// Copy the original value into a new object
Model model2 = modelCopier(model1);
// Check that they are not equal objects
assertNotEquals(model1, model2);
// Check that their values properties are not equal objects
assertNotEquals(model1.values, model2.values);
// Check that their values properties contain the same values though!
assertEquals(model1.values.size(), model2.values.size());
Integer value1 = model1.values.get(0);
Integer value2 = model2.values.get(0);
assertEquals(value1, value2);
对象及其Model
属性,但列表中 的值相等。
现在这失败了,因为values
失败了,这是有道理的,因为assertNotEquals(model1.values, model2.values)
类像这样覆盖了List
方法:
将指定的对象与此列表进行比较以确保相等。退货 当且仅当指定对象也是列表时,才返回true 具有相同的大小,并且两个中的所有对应元素对 名单是平等的。 (两个元素e1和e2相等,如果(e1 == null? e2 == null:e1.equals(e2))。换句话说,两个列表被定义为 如果它们包含相同顺序的相同元素,则相等。这个 定义可确保equals方法可跨 List接口的不同实现。
https://docs.oracle.com/javase/7/docs/api/java/util/List.html
答案 0 :(得分:4)
您正在寻找assertNotSame
:
预期和实际的声明没有引用同一对象。
答案 1 :(得分:1)
要满足您的要求,必须将对象引用的断言与对象内容的断言结合起来。
请注意,关于集合内容的断言不够充分:
assertEquals(model1.values.size(), model2.values.size());
Integer value1 = model1.values.get(0);
Integer value2 = model2.values.get(0);
assertEquals(value1, value2);
仅声明集合的第一个元素显然是不够的,但是如果您首先断言所期望的是克隆集合中的单个元素。事实并非如此。
相反,您应该依靠将equals()
应用于元素集的集合的equals()
方法。
使用Assert.assertNotSame()
断言Model
和Model.values
都没有引用同一对象。
然后使用Assert.assertEqual()
断言Model.values
集合在包含元素方面是相等的。
// Create the original value
Model model1 = ...
// Copy the original value into a new object
Model model2 = modelCopier(model1);
// 1) Check that they don't refer the same object
Assert.assertNotSame(model1, model2);
// 2) Check that they don't refer the same object
Assert.assertNotSame(model1.values, model2.values);
// 3) Check that their values properties contain the same values though!
Assert.assertEquals(model1.values, model2.values);
答案 2 :(得分:0)
比较参考文献:
assertTrue(model1.values != model2.values);