Comment puis-je faire une assertion d'égalité entre des listes dans un cas de test JUnit ? L'égalité devrait être entre le contenu de la liste.
Par exemple:
List<String> numbers = Arrays.asList("one", "two", "three");
List<String> numbers2 = Arrays.asList("one", "two", "three");
List<String> numbers3 = Arrays.asList("one", "two", "four");
// numbers should be equal to numbers2
//numbers should not be equal to numbers3
assertArrayEquals
nos jours. Utiliser en combinaison avecList#toArray
.assertArrayEquals
vous oblige à obtenir des tableaux de vos listes. Vous pouvez opérer directement sur la liste en utilisantassertIterableEquals
assertIterableEquals
disponible pour jUnit5 @ThetaSinnerRéponses:
Je me rends compte que cela a été demandé il y a quelques années, cette fonctionnalité n'existait probablement pas à l'époque. Mais maintenant, il est facile de faire ceci:
Si vous avez une version récente de Junit installée avec hamcrest, ajoutez simplement ces importations:
http://junit.org/junit4/javadoc/latest/org/junit/Assert.html#assertThat(T, org.hamcrest.Matcher)
http://junit.org/junit4/javadoc/latest/org/hamcrest/CoreMatchers.html
http://junit.org/junit4/javadoc/latest/org/hamcrest/core/Is.html
la source
System.out.println(actual == expected);
retournera faux, maisSystem.out.println(actual.equals(expected));
retournera vrai..equals(..)
au lieu de==
?Ne vous transformez pas en chaîne et ne comparez pas. Ce n'est pas bon pour la performance. Dans le junit, dans Corematchers, il y a un matcher pour ça =>
hasItems
C'est la meilleure façon que je connaisse pour vérifier les éléments d'une liste.
la source
Assert.assertEquals(4,yourList.size());
assertThat(yourList.toArray(), arrayContainingInAnyOrder(1,2,3,4,5));
toString()
version n'est pas la meilleure façon.Il s'agit d'une réponse héritée, adaptée à JUnit 4.3 et versions antérieures. La version moderne de JUnit inclut un message d'erreur lisible intégré dans la méthode assertThat. Préférez d'autres réponses à cette question, si possible.
Pour mémoire, comme @Paul l'a mentionné dans son commentaire à cette réponse, deux
List
s sont égaux:Voir les JavaDocs de l'
List
interface .la source
assertEquals(Object, Object)
de JUnit4 / JUnit 5 ouassertThat(actual, is(expected));
de Hamcrest proposé dans les autres réponses ne fonctionneront que comme les deuxequals()
ettoString()
sont remplacés pour les classes (et profondément) des objets comparés.Cela est important car le test d'égalité dans l'assertion s'appuie sur
equals()
et le message d'échec du test s'appuie surtoString()
les objets comparés.Pour les classes intégrées telles que
String
,Integer
et ainsi de suite ... pas de problème car elles remplacent à la foisequals()
ettoString()
. Il est donc parfaitement valable d'affirmerList<String>
ouList<Integer>
avecassertEquals(Object,Object)
.Et à ce sujet: vous devez surcharger
equals()
dans une classe parce que cela a du sens en termes d'égalité d'objet, pas seulement pour faciliter les assertions dans un test avec JUnit.Pour faciliter les affirmations, vous avez d'autres moyens.
En tant que bonne pratique, je préfère les bibliothèques d'assertion / matcher.
Voici une solution AssertJ .
org.assertj.core.api.ListAssert.containsExactly()
est ce dont vous avez besoin: il vérifie que le groupe réel contient exactement les valeurs données et rien d'autre, dans l'ordre indiqué dans le javadoc.Supposons une
Foo
classe où vous ajoutez des éléments et où vous pouvez les obtenir.Un test unitaire de
Foo
cela affirme que les deux listes ont le même contenu pourrait ressembler à ceci:Un bon point d'AssertJ est que déclarer a
List
comme attendu est inutile: cela rend l'assertion plus droite et le code plus lisible:Mais les bibliothèques d'assertions / matrices sont indispensables car elles vont vraiment plus loin.
Supposons maintenant que
Foo
cela ne stocke pas les instancesString
s maisBar
s.C'est un besoin très courant. Avec AssertJ, l'assertion est encore simple à écrire. Mieux, vous pouvez affirmer que le contenu de la liste est égal même si la classe des éléments ne remplace pas
equals()/hashCode()
alors que JUnit l'exige:la source
Si vous ne vous souciez pas de l'ordre des éléments, je recommande
ListAssert.assertEquals
dans junit-addons.Lien: http://junit-addons.sourceforge.net/
Pour les utilisateurs paresseux de Maven:
la source
Vous pouvez utiliser assertEquals dans junit.
Si l'ordre des éléments est différent, il renverra une erreur.
la source
si vous ne voulez pas créer une liste de tableaux, vous pouvez également essayer ceci
la source
la source
Ne réinventez pas la roue!
Il existe une bibliothèque Google Code qui fait cela pour vous: Hamcrest
la source
Je sais qu'il existe déjà de nombreuses options pour résoudre ce problème, mais je préférerais faire ce qui suit pour affirmer deux listes dans n'importe quel ordre :
la source
assertEquals(expected, result);
travaille pour moi. Puisque cette fonction obtient deux objets, vous pouvez lui passer n'importe quoi.la source
Je ne pense pas que toutes les réponses ci-dessus donnent la solution exacte pour comparer deux listes d'objets. La plupart des approches ci-dessus peuvent être utiles pour suivre uniquement la limite des comparaisons - Comparaison de taille - Comparaison de référence
Mais si nous avons des listes d'objets de même taille et des données différentes au niveau des objets, cette approche de comparaison n'aidera pas.
Je pense que l'approche suivante fonctionnera parfaitement avec la substitution d'égaux et de méthode de hashcode sur l'objet défini par l'utilisateur.
J'ai utilisé la lib Xstream pour remplacer les égaux et le hashcode, mais nous pouvons également remplacer les égaux et le hashcode par une logique / comparaison gagnée.
Voici l'exemple pour votre référence
La chose la plus importante est que vous pouvez ignorer les champs par Annotation (@XStreamOmitField) si vous ne voulez pas inclure de champs sur la vérification d'égalité des objets. Il y a beaucoup d'annotations comme celle-ci à configurer, alors jetez un œil aux annotations de cette bibliothèque.
Je suis sûr que cette réponse vous fera gagner du temps pour identifier la bonne approche pour comparer deux listes d'objets :). Veuillez commenter si vous rencontrez des problèmes à ce sujet.
la source