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/