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

标签 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);
    }
}

最佳答案

assertArrayEquals 方法 - 在处理迭代和各种其他功能之后 - 最终解析为此调用:

expected.equals(actual)

因此,它在您的 User 类上调用 equals ,并且由于您尚未声明 equals 方法,因此该方法委托(delegate)给默认实现Object 类中的 equals 使用相等运算符进行比较,即比较对象引用而不是它们的值。

因此,assertArrayEquals 调用最终会调用:

actual[0] == expected[0]

并且由于它们不是断言失败的同一实例。

如果您想断言这些 User 实例之间相等,那么您必须提供一些定义,说明两个 User 实例相等意味着什么,即在 User 上定义一个 equals 方法。

这是一个例子:

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Objects.equals(name, user.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name);
    }

如果您将上述内容添加到您的 User 类中,那么您的测试就会通过。

关于java - Junit - AssertArrayEquals 不适用于用户定义的对象(非原始数据类型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56585393/

相关文章:

java - 设计适用于所有租户的 camunda 通用流程

Javafx mysql,如何一一获取行

java - 当返回类型为 List 时,无法覆盖父类(super class)中的方法

java - org.mockito.exceptions.misusing.InvalidUseOfMatchersException 当我没有匹配器时

javascript - 单元测试 Angular @Input 设置功能未触发

java - 验证私有(private)方法未执行 JMockit

java - SpringJUnit4ClassRunner 应该初始化它的上下文多少次?

java - Android 应用程序正在缓存 JSON

java - JUnit并发访问synchronizedSet

java - 如何从 junit-tests 中的 .properties 文件读取字符串?