我正在编写JUnit
测试,我想测试2个对象中的所有字段是否相等。
我尝试了以下内容:
@Test
public void testPersonObjectsAreEqual(){
Person expectedPerson = new Person("100100", "sampleName", "sampleAddress");
Person actualPersonReturned = repository.getPersonById("100100);
Assert.assertTrue(EqualsBuilder.reflectionEquals(expectedPerson, actualPersonReturned));
}
但是测试失败了,即使两个对象中的字段是相同的。
他们都有:100100
,sampleName
和sampleAddress
答案 0 :(得分:2)
最简单/最首选的方法是在您断言的所有类(包括嵌套类)中覆盖equals()
(和hashCode()
)并使用Assert.assertEquals(expected, actual)
。
2个字段的比较失败的原因是因为EqualsBuilder.reflectionEquals(Object lhs, Object rhs)
进行了浅层比较,而实际代码中Person
引用了Address
实例,但没有equals()
已实施。
答案 1 :(得分:2)
EqualsBuilder#reflectionEquals()
有很多变化。
考虑排除不需要的属性。然后你可以精确地比较2个对象。
您还可以在特定类中使用简单的equals()
覆盖并执行相同的操作。
答案 2 :(得分:1)
在您的示例中,您需要覆盖类Person中的equals方法(如果Person对象的属性全部相等则返回true)。例如:
public class Person {
private String name;
private String surname;
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (surname == null) {
if (other.surname != null)
return false;
} else if (!surname.equals(other.surname))
return false;
return true;
}
}
您可以使用IDE自动执行此操作,之前的代码段是使用Eclipse自动生成的。
答案 3 :(得分:0)
在Person类中编写equals,hashCode方法来决定对象的相等性
答案 4 :(得分:0)
就个人而言,我会为此使用自定义匹配器
concatenate
答案 5 :(得分:0)
你可以使用一个名为Unitils的漂亮的库,它可以很好地记录错误的信息
User user1 = new User(1, "John", "Doe");
User user2 = new User(1, "John", "Doe");
assertReflectionEquals(user1, user2);
易于使用,不需要覆盖equals和hash方法。 此断言遍历两个对象中的所有字段,并使用反射比较它们的值。对于上面的示例,它将首先比较两个id字段值,然后是第一个字段值,最后是最后两个字段值。
答案 6 :(得分:-1)
您可以使用assertEquals而不是assertTrue
进行测试@Test
public void testPersonObjectsAreEqual(){
Person expectedPerson = new Person("100100", "sampleName", "sampleAddress")
Person actualPersonReturned = repository.getPersonById("100100);
Assert.assertEquals(expectedPerson, actualPersonReturned);
}