如何使用reflectionEquals检查2个对象中的所有字段是否相等?

时间:2017-02-22 11:13:09

标签: java string junit assert

我正在编写JUnit测试,我想测试2个对象中的所有字段是否相等。

我尝试了以下内容:

@Test
    public void testPersonObjectsAreEqual(){

        Person expectedPerson = new Person("100100", "sampleName", "sampleAddress");
        Person actualPersonReturned = repository.getPersonById("100100);

        Assert.assertTrue(EqualsBuilder.reflectionEquals(expectedPerson, actualPersonReturned));
    }

但是测试失败了,即使两个对象中的字段是相同的。

他们都有:100100sampleNamesampleAddress

7 个答案:

答案 0 :(得分:2)

最简单/最首选的方法是在您断言的所有类(包括嵌套类)中覆盖equals()(和hashCode())并使用Assert.assertEquals(expected, actual)

2个字段的比较失败的原因是因为EqualsBuilder.reflectionEquals(Object lhs, Object rhs)进行了浅层比较,而实际代码中Person引用了Address实例,但没有equals()已实施。

答案 1 :(得分:2)

EqualsBuilder#reflectionEquals()有很多变化。 考虑排除不需要的属性。然后你可以精确地比较2个对象。

您还可以在特定类中使用简单的equals()覆盖并执行相同的操作。

https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/builder/EqualsBuilder.html#reflectionEquals-java.lang.Object-java.lang.Object-java.lang.String...-

答案 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字段值,然后是第一个字段值,最后是最后两个字段值。

http://www.unitils.org/tutorial-reflectionassert.html

答案 6 :(得分:-1)

您可以使用assertEquals而不是assertTrue

进行测试
@Test
public void testPersonObjectsAreEqual(){

    Person expectedPerson = new Person("100100", "sampleName", "sampleAddress")
    Person actualPersonReturned = repository.getPersonById("100100);

    Assert.assertEquals(expectedPerson, actualPersonReturned);
}