2016-03-31 3 views
0

Мне нужно утверждать два сложных объекта, которые могут содержать как примитивные, так и n уровни объектов внутри. поэтому я googled и выбрал библиотеку unitils. Но у меня есть условие, что мне нужно рассматривать как пустую, так и пустую строку как равные. Но здесь он поддерживает только ReflectionComparatorMode.IGNORE_DEFAULTS. Сценарий:Как сравнить два сложных объекта и игнорировать как пустую, так и пустую строку?

public class AssertVerify { 

    public static void main(String args[]){ 

    CustomerPojo cuPojo1=new CustomerPojo(); 
    CustomerPojo cuPojo2=new CustomerPojo(); 

    cuPojo1.setCustomerName("obuli"); 
    cuPojo1.setCustomerAge("20"); 
    cuPojo1.setAddress(""); 

    cuPojo2.setCustomerName("obuli"); 
    cuPojo2.setCustomerAge("20"); 


    /** 
    * Asserting two pojos 
    */  
    ReflectionAssert.assertReflectionEquals(cuPojo1, cuPojo2, 
      ReflectionComparatorMode.LENIENT_DATES ,ReflectionComparatorMode.IGNORE_DEFAULTS); 

}  

Ошибка:

junit.framework.AssertionFailedError: 
Expected: CustomerPojo<customerName="obuli", customerAge="20", Address=""> 
    Actual: CustomerPojo<customerName="obuli", customerAge="20", Address=null> 

    --- Found following differences --- 
    Address: expected: "", actual: null 

    --- Difference detail tree --- 
    expected: CustomerPojo<customerName="obuli", customerAge="20", Address=""> 
    actual: CustomerPojo<customerName="obuli", customerAge="20", Address=null> 

    Address expected: "" 
    Address actual: null 


    at junit.framework.Assert.fail(Assert.java:47) 
    at  org.unitils.reflectionassert.ReflectionAssert.assertReflectionEquals(ReflectionA ssert.java:136)at  org.unitils.reflectionassert.ReflectionAssert.assertReflectionEquals(ReflectionA ssert.java:99) 
atcom.assertion.verify.AssertVerify.main(AssertVerify.java:52) 

picked up _JAVA_OPTIONS: -Djava.net.preferIPv4Stack=true 

Мне нужно добавить правило, рассматривать как нуль и пустая строка, как равные.

Есть ли какие-либо возможные решения для моей ситуации.

+1

Почему бы просто не реализовать сопоставимый интерфейс и написать собственный метод equals? – Gremash

ответ

0

Как было упомянуто Gremash вам следует реализовать comparable интерфейс и переопределить equals метод, то не спешите это, убедитесь, что вы знаете, что вы делаете, так как вы можете испортить работу в коллекции, когда вы используете свои собственные объекты, которые реализуют этот интерфейс и использование ваш метод. Взгляните (если это возможно) на Core Java 1-2 series, эта проблема обсуждается в этих книгах и подробно объясняется. Есть некоторые правила, например, равен() должен определить отношение эквивалентности (оно должно быть рефлексивно, симметрично и транзитивно), подробнее об этом: What issues should be considered when overriding equals and hashCode in Java?

Я думаю, что его все-таки лучше идти по этому пути, то полагаться на другую библиотеку ,