Behaupten, dass zwei java beans sind äquivalent
Diese Frage ist nah, aber noch nicht das, was ich will. Ich möchte behaupten, in einer Allgemeinen Weise, dass zwei bean-Objekte äquivalent sind. In Fall Sie nicht sind, möchte ich eine detaillierte Fehlermeldung zu erklären, den Unterschied, anstatt einen booleschen Operatoren "gleich" oder "ungleich".
vielleicht finden Sie in diesem blog-Eintrag aufschlussreich blogs.atlassian.com/developer/2009/06/...
Irgendeinen Grund, warum du dies geschrieben, als Kommentar? das ist eine gute Antwort!
Hier ist eine meta-problem: Sie sind verwirrend "gleich", "gleich" und "gleichwertig", wie jeder andere auch.
du hast Recht: gleich und gleichwertig sind, sind nicht identisch 😉
Irgendeinen Grund, warum du dies geschrieben, als Kommentar? das ist eine gute Antwort!
Hier ist eine meta-problem: Sie sind verwirrend "gleich", "gleich" und "gleichwertig", wie jeder andere auch.
du hast Recht: gleich und gleichwertig sind, sind nicht identisch 😉
InformationsquelleAutor ripper234 | 2009-11-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich empfehle, verwenden Sie unitils Bibliothek:
http://www.unitils.org/tutorial-reflectionassert.html
Siehe auch:
Ich muss sagen, diese Bibliothek ist super cool. Und wenn der test fehlschlägt, meldet es genau die Felder, die den Fehler verursacht und was Ihre Werte waren. Gute Arbeit, Mann.
InformationsquelleAutor gavenkoa
InformationsquelleAutor Chomeh
Können Sie Commons-Lang's
ToStringBuilder
sowohl konvertieren in lesbare Zeichenfolgen zu verwenden und dannassertEquals()
auf beiden Saiten.Wenn Sie wie XML, die Sie verwenden können, java.lang.XMLEncoder um Ihre Bohne in XML und vergleichen Sie zwei XML-Dokumente.
Persönlich bevorzuge ich
ToStringBuilder
da es Ihnen mehr Kontrolle über die Formatierung und ermöglicht es Ihnen, Dinge zu tun, wie die Sortierung der Elemente in einem set zu vermeiden, falsch-negative Befunde.Schlage ich vor, um jedes Feld der bean in einer anderen Linie zu machen es viel einfacher, Sie zu vergleichen (siehe mein blog für details).
InformationsquelleAutor Aaron Digulla
Ich denke, die meisten generischen Ansatz zu reflektieren, die bean-Mitglieder und testen Sie auf Gleichheit one-by-one. Die gemeinsame langs
EqualsBuilder
ist ein guter start und es sollte nicht eine große Sache, Sie anzupassen (auf source-level) nach Ihren Anforderungen (reporting, die Unterschiede anstatt die gleich Ergebnis).Früher habe ich dies als gut, aber mit einer leicht anderen. Um auch eine aussagekräftige Fehlermeldung, nach der Verwendung EqualsBuilder. reflectionEquals ich ein assert auf die beiden ToStringBuilder.reflectionToString (schließlich mit einem scheitern(...) sollte der string gleich sein eigentlich successed). Eclipse wird dann markieren Sie die Unterschiede zwischen den beiden Objekten.
Ich weiß, und das ist, warum ich vorgeschlagen, die Anpassung der EqualsBuilder code.
InformationsquelleAutor Andreas_D
Für unit-Tests dies kann mit JUnit und Mockito mit ReflectionEquals. Bei der Umsetzung in der folgenden Art und Weise, wird es einen dump der JSON-Repräsentationen der Objekte, wenn irgendwelche Felder nicht gleich sind, das macht es leicht zu finden, die problematische Unterschied.
InformationsquelleAutor Hazok
Können Sie alle Felder wie diese:
InformationsquelleAutor borjab
Seit Sie wusste nicht, wie die Antworten in der Frage verwiesen, warum nicht einfach eine
toXml
Methode in jeder Bohne, die Sie in einer xml-Datei und verwenden Sie dann xmlUnit zu vergleichen.Erhalten Sie mehr info auf den Vergleich von xml-Dateien hier:
Beste Methode zum vergleichen von 2 XML-Dokumenten in Java
InformationsquelleAutor James Black
Du bist nicht wirklich die Geltendmachung von Gleichheit, mehr ein "diff". Klar, die Bedeutung von "gleich" hängt von bestimmten Logik, die für jede Art, und die Vertretung der Unterschied kann auch variieren. Ein wesentlicher Unterschied zwischen dieser Anforderung und einer konventionellen equals() ist, dass in der Regel equals () - Stoppt, sobald der erste Unterschied ist, Sie wollen weitermachen und vergleichen Sie jedes Feld.
Ich würde schauen Wiederverwendung einige der equals () - Muster, aber ich vermute, Sie müssen eigenen code schreiben.
InformationsquelleAutor djna
Gehe ich davon aus, dass hier beide Bohnen sind von der gleichen Art, in diesem Fall nur die member-variable Werte unterscheiden sich in den bean-Instanzen.
Definieren eine util-Klasse (public static final mit private ctor) genannt, sagen, BeanAssertEquals. Die Verwendung von Java-reflection erhalten Sie den Wert jedes member-variable in jeder Bohne. Dann eine equals() zwischen den Werten für die gleichen member-variable in unterschiedlichen Bohnen. Wenn eine Gleichheit fehl, erwähnen den Namen des Feldes.
Hinweis: die Variablen sind in der Regel privat ist, so würden Sie brauchen, um reflektion verwenden, um vorübergehend die Erreichbarkeit von privaten Mitgliedern.
Zusätzlich, je nachdem, wie feinkörnig die Sie wollen, die Behauptung zu arbeiten, sollten Sie folgende Punkte beachten:
Gleichheit der member-Variablen, die nicht in der bean-Klasse aber alle Oberklassen.
Gleichheit der Elemente in arrays, im Falle, dass eine member-variable vom Typ array.
Für zwei Werte in ein bestimmtes Mitglied über die Bohnen, die Sie vielleicht in Erwägung ziehen BeanAssertEquals.assertEquals(Wert1, Wert2) anstelle von Wert1.equals(value2).
InformationsquelleAutor
Ersten Frage würde ich Sie Fragen, ob ist, willst du 'tief' gleich auf die Bohne? hat es Kind-Bohnen, die getestet werden müssen? Sie können das überschreiben der equals-Methode, was aber nur einen booleschen Wert zurückgibt, so dass man daraus ein 'comparator' und das könnte eine Ausnahme mit einer Meldung über das, was war es gleich nicht.
In den folgenden Beispielen, die ich aufgeführt habe, ein paar Möglichkeiten zur Implementierung der equals-Methode.
wenn Sie möchten, um zu überprüfen, ob Sie die gleiche Objekt-Instanz, dann wird die normale equals-Methode von Object wird Ihnen sagen.
wenn Sie möchten, schreiben Sie eine Kunden equals-Methode, um zu überprüfen, dass alle member-Variablen von einem Objekt macht Sie gleich, dann können Sie das überschreiben der equals-Methode wie folgt aus...
Die Letzte option ist die Verwendung der java reflection um zu überprüfen, alle member-Variablen, die in der equals-Methode. Das ist großartig, wenn Sie wirklich wollen, um zu überprüfen, jedes Mitglied varible über seine bean-get/set-Methode. Es wird nicht (denke ich nicht) erlaubt Ihnen, zu überprüfen private memeber Variablen beim testen der beiden Objekte gleich sind. (nicht wenn das Objekt-Modell verfügt über eine zirkuläre Abhängigkeit, nicht tun, wird es nie wieder)
HINWEIS: dies ist nicht mein code, es kommt von...
Java Reflection equals
public static boolean equals(Object bean1, Objekt-bean2)
{
//Behandeln der trivialen Fällen
wenn (bean1 == bean2)
return true;
Die eine Sache, die dies nicht tun, es Ihnen sagen, der Grund für den Unterschied, aber es kann getan werden, per Nachricht Log4J, wenn Sie finden einen Abschnitt, der ist nicht gleich.
so im realen code, Sie können eine Nachricht über log4j.
Es sollte nicht notwendig sein, auch über die Protokolle während der unit-Tests. Die fehlgeschlagenen tests sollte Ihnen sagen, alles, was Sie wissen müssen.
InformationsquelleAutor jeff porter
(um zu bauen auf mein Kommentar zu Andreas_D oben)
Dies ist, was ich verwenden, und ich glaube, es erfüllt alle grundlegenden Anforderungen. Indem Sie geltend machen, die auf die reflektierende ToString dann Eclipse markieren Sie den Unterschied.
Während Hamcrest bieten eine viel schönere Botschaft, das erfordert sehr viel weniger code.
InformationsquelleAutor Michael Lloyd Lee mlk
Den xtendbeans Bibliothek von Interesse sein könnten in diesem Zusammenhang:
Dadurch entsteht eine JUnit
ComparisonFailure
à la:Könnten Sie es auch verwenden, nur um die textliche Darstellung für andere Zwecke:
Mit dieser Bibliothek können Sie die oben syntaktisch gültige Objekt-Initialisierung code-fragments kopieren/einfügen in ein (Xtend) Quelle Klasse für die
expectedBean
haben, aber Sie nicht nicht, es kann sehr gut verwendet werden, ohne Xtend als gut.InformationsquelleAutor vorburger