繁体   English   中英

Assert.assertEquals的奇怪行为

[英]Strange behaviour of Assert.assertEquals

根据此处的许多帖子, 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.
}

考虑:

Assert.assertArrayEquals(result.toArray(), targetResult.toArray());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM