Affirmez que deux haricots java sont équivalents
Cette question est proche, mais pas encore ce que je veux. Je tiens à affirmer, de façon générale, que les deux bean objets sont équivalents. Dans le cas où ils ne le sont pas, je voudrais un message d'erreur détaillé expliquant la différence au lieu d'un booléen "égal" ou "pas égal".
source d'informationauteur ripper234
Vous devez vous connecter pour publier un commentaire.
Je vous recommande d'utiliser unitils bibliothèque:
http://www.unitils.org/tutorial-reflectionassert.html
Voir aussi:
Vous pouvez utiliser Commons Lang's
ToStringBuilder
pour convertir tous deux lisible cordes et ensuite utiliserassertEquals()
sur les deux chaînes.Si vous aimez XML, vous pouvez utiliser java.lang.XMLEncoder de transformer votre bean en XML, puis de comparer les deux documents XML.
Personnellement, je préfère
ToStringBuilder
car il vous donne plus de contrôle sur le formatage et vous permet de faire des choses comme le tri des éléments dans un ensemble à éviter les faux négatifs.Je vous suggère de mettre chaque champ de la fève dans une ligne différente pour le rendre beaucoup plus simple de les comparer (voir mon blog pour plus de détails).
Je pense, le plus générique de l'approche est de refléter la fève membres et de les tester pour l'égalité, un par un. La commune de lang
EqualsBuilder
est un bon début et il ne doit pas être une grosse affaire, pour l'adapter (au niveau de la source) pour vos besoins (reporting les différences au lieu de retourner le résultat est égal à).Pour les tests unitaires cela peut être fait avec JUnit et Mockito à l'aide de ReflectionEquals. Lors de la mise en œuvre de la manière suivante, il va vider le JSON représentations des objets lorsque tous les champs ne sont pas égaux qui le rend facile de trouver le fautif différence.
Vous pouvez définir tous les champs comme ceci:
Puisque vous n'aimez pas les réponses à la question que vous l'avez mentionné, pourquoi ne pas simplement avoir un
toXml
méthode dans chaque haricots, mettez-les dans un fichier xml et l'utilisation xmlUnit à comparer.Vous pouvez obtenir plus d'informations sur la comparaison des fichiers xml ici:
La meilleure façon de comparer 2 documents XML en Java
Vous n'êtes pas vraiment en affirmant l'égalité, en plus de faire un "diff". Clairement, le sens de "même" dépend notamment de la logique pour chaque type, et la représentation de la différence peut également varier. Une différence majeure entre cette exigence et un classique equals (), c'est que généralement equals() va s'arrêter dès que la première différence est vu, vous aurez envie de continuer et de comparer tous les domaines.
Je regarde la réutilisation de certains equals() modèles, mais je soupçonne que vous aurez besoin d'écrire votre propre code.
Je suis en supposant ici que les haricots sont du même type, dans ce cas, seule la variable de membre de valeurs diffèrent selon le haricot instances.
Définir un util de classe (public static final avec salle de ctor) a appelé, dire, BeanAssertEquals. L'utilisation de Java réflexion pour obtenir la valeur de chaque variable membre dans chaque fève de cacao. Ensuite faire un equals() entre les valeurs pour le même membre de la variable dans les différents grains. Si une égalité omet de mentionner le nom du champ.
Remarque: les variables de membre sont généralement privés, de sorte que vous devez utiliser la réflexion pour modifier temporairement l'accessibilité des membres privés.
En outre, selon la façon dont fines que vous voulez l'affirmation de travail, vous devriez considérer les points suivants:
L'égalité des membres de variables qui ne sont pas dans la classe d'haricot mais toutes les super-classes.
L'égalité d'éléments dans les tableaux, dans le cas où un membre de la variable est de type array.
Pour les deux valeurs d'un membre donné à travers les haricots, vous pourriez envisager de faire BeanAssertEquals.assertEquals(valeur1, valeur2) au lieu de valeur1.equals(valeur2).
La première quesion que je serais obligé de vous demander si c'est, voulez-vous faire "profond" est égal à la Fève? a-t-elle des enfants haricots qui doivent être testés? Vous pouvez remplacer la méthode equals, mais cela ne renvoie un booléen, donc vous pouvez créer un "comparateur" et qui pourrait jeter une exception avec un message sur ce qui n'était pas égal.
Dans les exemples suivants, j'ai énuméré quelques-uns des moyens à mettre en œuvre la méthode equals.
si vous voulez vérifier s'ils sont sur la même instance d'objet, alors que la normale est égale à la méthode de l'Objet, vous le dira.
si vous voulez écrire un client méthode equals pour vérifier que tous les membres de varibles d'un objet de les rendre égaux, alors vous pouvez remplacer la méthode equals comme ça...
La dernière option est d'utiliser java réflexion de vérifier tous les membres de varibles dans la méthode equals. C'est très bien si vous voulez vérifier chaque membre de la varible via son haricot/définition de la méthode. Il l'habitude (je ne pense pas) vous permettent de vérifier privé memeber varibles lors de l'essai des deux objets sont les mêmes. (pas si votre modèle d'objet a une forme circulaire de dépendance, ne faites pas cela, il ne reviendra jamais)
REMARQUE: ce n'est pas mon code, il vient de...
Java de Réflexion est égal à
public static boolean equals(Object bean1, Objet bean2)
{
//Gérer les cas triviaux
si (bean1 == bean2)
return true;
La seule chose que cela ne fait pas ça pour vous dire la raison de cette différence, mais qui pourrait être fait via message à Log4J lorsque vous trouvez un article qui n'est pas égal.
(à construire sur mon commentaire pour Andreas_D ci-dessus)
C'est ce que j'utilise, et je crois qu'il répond à toutes les exigences de base. En faisant l'assertion sur la réflexion des ToString puis Eclipse mettra en évidence la différence.
Tout Hamcrest peut offrir beaucoup plus de message, cela implique beaucoup moins de code.
La xtendbeans bibliothèque pourrait être d'intérêt dans ce contexte:
Cela produit un JUnit
ComparisonFailure
à la:Vous pouvez également l'utiliser juste pour obtenir la représentation textuelle à d'autres fins:
Avec cette bibliothèque, vous pouvez utiliser le haut syntaxiquement valide l'initialisation de l'objet fragment de code à copier/coller dans un (Xtend) classe de source pour la
expectedBean
mais vous n'en avez pas, il peut parfaitement être utilisé sans Xtend.