2013-12-16 100 views
0

我想比较两个对象与复杂的结构,但Apache EqualsBuilder.reflectionEquals是无法比较这两个。你能告诉我我错过了什么吗?它作为结果返回false。复杂对象的Apache EqualsBuilder

import org.apache.commons.lang.builder.EqualsBuilder; 

public class Test { 
    public static void main(String[] args){ 

     FirstLevel firstLevel1 = new FirstLevel("string1", "string2", new SecondLevel("line1")); 
     FirstLevel firstLevel12 = new FirstLevel("string1", "string2", new SecondLevel("line1")); 

     System.out.print(EqualsBuilder.reflectionEquals(firstLevel1, firstLevel12, true)); 
    } 
} 

class FirstLevel{ 

    String line1; 
    String line2; 
    SecondLevel secondLevel; 

    FirstLevel(String line1, String line2, SecondLevel secondLevel) { 
     this.line1 = line1; 
     this.line2 = line2; 
     this.secondLevel = secondLevel; 
    } 
} 

class SecondLevel{ 
    String level2Line1; 


    SecondLevel(String level2Line1) { 
     this.level2Line1 = level2Line1; 
    } 
} 

回答

1

EqualsBuilder.reflectionEquals方法不能经由反射申请平等的相同的测试到第二级别类字段。您需要在SecondLevel类中覆盖equals(因此hashCode)才能通过。

如果您不能重写equals,你是快乐的另一依赖添加到您的项目,然后你也可以看看ReflectionAssert.assertReflectionEquals方法在Unitils库:

http://www.unitils.org/apidocs/org/unitils/reflectionassert/ReflectionAssert.html

+0

但是,如果我不什么是否拥有对班级的控制权?我不能使用扩展也因为类紧密耦合。 –

+0

您可以在FirstLevel和SecondLevel之外的测试工具类中定义equals方法,该方法基于FirstLevel的两个实例之间的相等性来测试值? – JMM

+0

您也可以查看Unitils库中的ReflectionAssert.assertReflectionEquals - 我已通过指向它的链接更新了我的答案。 – JMM