Junit-AssertArrayEquals不适用于用户定义的对象(非原始数据类型)

时间:2019-06-13 17:01:39

标签: java unit-testing junit

assertArrayEquals不适用于用户定义的类。

我有User类,该类仅具有name属性。当我为User类创建一个数组对象(实际的和预期的)并尝试使用assertArrayEquals进行测试时,测试失败。

我遇到错误

arrays first differed at element [0]; expected:<cts.Learning.User@3fa77460> but was:<cts.Learning.User@619a5dff>"

我正在使用Junit-4.12和Hamcrest-all 1.3版本。

public class User {
    private String name;
    public User(){} 
    public User(String name) {
        this.name = name;       
    }   
    public String getName(){
        return name;
    }   
    public void setName(String name) {
        this.name = name;
    }
}

import org.junit.*;
import static org.junit.Assert.*;

public class UserJunit {

    @Test
    public void testUserBO() {          
        User[] expected = new User[2];      
        expected[0] = new User("A");
        expected[1] = new User("B");

        User[] actual = new User[2];
        actual[0] = new User("A");
        actual[1] = new User("B");  
        assertArrayEquals(actual, expected);
    }
}

1 个答案:

答案 0 :(得分:1)

assertArrayEquals方法-处理了迭代和其他各种功能之后,最终解决了该调用:

expected.equals(actual)

因此,它会在您的equals类上调用User,并且由于您尚未声明equals方法,因此它将{{{ 1}}类,它使用相等运算符进行比较,即,它比较对象引用而不是它们的值。

因此,equals调用最终调用:

Object

由于它们不是同一实例,所以断言失败。

如果要断言assertArrayEquals的这些实例之间的相等性,则必须提供一些定义,以使actual[0] == expected[0] 的两个实例相等意味着什么,即定义一个{{1} } User上的方法。

这是一个例子:

User

如果将以上内容添加到equals类中,则测试将通过。