根据此处的许多帖子,Assert.assertEquals
应该使用深刻的见识比较集合,并且相同内容的两个数组应该相等。
我已经安装了JUnit 4.12。
呼唤
List<Integer[]> result, targetResult;
(both are created as ArrayList)
....
Assert.assertEquals("counted small array ", result, targetResult);
,其中result和targetResult具有相同的内容,但是测试失败。
我已经看过
assertEquals
如何完成这项工作。为了比较整数数组,它达到了://----in AbstractList:
public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof List))
return false;
ListIterator<E> e1 = listIterator();
ListIterator e2 = ((List) o).listIterator();
while (e1.hasNext() && e2.hasNext()) {
E o1 = e1.next();
Object o2 = e2.next();
if (!(o1==null ? o2==null : o1.equals(o2)))
return false;
...
//and more deep, in Object:
public boolean equals(Object obj) {
return (this == obj);
}
这意味着,它只比较引用。
如何使
Assert.assertEquals()
正常工作? 最佳答案
assertEquals的问题是equals(Object)
健全的假设。不幸的是,Object固有的所有数组都没有专门的方法。这意味着您必须调用Arrays.equals(a,b)来比较两个数组,但是如果这些数组在集合内,则无法方便地执行此操作。
注意:我也不知道为什么打印[Ljava.lang.Integer@72173fed
对于这样的数组还是不错的toString
(这是我在博客中多次提出的建议)
这意味着,它仅比较哈希码。
它不比较hashCode(),而是比较引用。 hashCode()既不是内存地址,也不是,因为当对象在内存中移动时它们无法更改。
如果您希望数据结构相等,请使用符合您期望的支持相等的集合
List<List<Integer>> result
如果您想提高效率,因为
int
使用4个字节,而Integer
可以使用20个字节(包括引用)。List<int[]> result
public static void assertEqualsArray(List<Int[]> a, List<int[]> b) {
// compare the list of arrays.
}
关于java - Assert.assertEquals的奇怪行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36082345/