2016-03-31 7 views
0

Ich muss zwei komplexe Objekte aktivieren, die sowohl primitive als auch n Ebenen von Objekten enthalten können. Also googelte ich und wählte eine Bibliothek unitils. Aber ich habe Bedingung, dass ich sowohl die null und leere Zeichenfolge als gleich betrachten muss. Aber hier unterstützt es nur ReflectionComparatorMode.IGNORE_DEFAULTS. Szenario:Wie zwei komplexe Objekte zu vergleichen und Null und leere Zeichenfolge zu ignorieren?

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); 

}  

Fehler:

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 

Ich brauche eine Regel hinzuzufügen, die sowohl für null und leere Zeichenkette als gleich betrachten.

Gibt es eine mögliche Lösung für meine Situation.

+1

Warum nicht einfach die vergleichbare Schnittstelle implementieren und Ihre eigene equals-Methode schreiben? – Gremash

Antwort

0

Wie von Gremash erwähnt Sie shoud comparable-Schnittstelle implementieren und equals Methode überschreiben, nicht diese Eile, stellen Sie sicher, dass Sie wissen, was Sie da tun Sie vermasseln Arbeit in einer Sammlung können, wenn Sie Ihre eigenen Objekte verwenden, die diese Schnittstelle und die Nutzung implementieren Ihre Methode. Werfen Sie einen Blick (wenn möglich) auf Core Java 1-2-Serie, diese Problematik wird in diesen Büchern diskutiert und ausführlich erklärt. Es gibt einige Regeln zum Beispiel gleich() eine Äquivalenzbeziehung definieren (es muss reflexiv, symmetrisch sein, und transitive), mehr dazu: What issues should be considered when overriding equals and hashCode in Java?

Ich denke, es ist immer noch besser, diesen Weg zu gehen, dann auf andere Bibliothek verlassen .