JUnit 4 comparer les collections

Comment pouvez-vous affirmer succinctement l’égalité des éléments de collections , en particulier un Set dans JUnit 4 ?

Vous pouvez simplement affirmer que les deux ensembles sont égaux les uns aux autres, ce qui appelle la méthode Set equals () .

 public class SimpleTest { private Set setA; private Set setB; @Before public void setUp() { setA = new HashSet(); setA.add("Testing..."); setB = new HashSet(); setB.add("Testing..."); } @Test public void testEqualSets() { assertEquals( setA, setB ); } } 

Ce test passera si les deux ensembles ont la même taille et contiennent les mêmes éléments.

Apache commun à la rescousse.

 assertTrue(CollectionUtils.isEqualCollection(coll1, coll2)); 

Fonctionne comme un charme. Je ne sais pas pourquoi mais j’ai trouvé qu’avec les collections, les assertEquals(coll1, coll2) suivants assertEquals(coll1, coll2) ne fonctionnent pas toujours. Dans le cas où cela a échoué pour moi, j’avais deux collections sauvegardées par Sets. Ni hamcrest ni junit ne diraient que les collections étaient égales même si je savais qu’elles l’étaient. En utilisant CollectionUtils, cela fonctionne parfaitement.

avec du hamcrest :

 assertThat(s1, is(s2)); 

avec plaine affirmer:

 assertEquals(s1, s2); 

NB: t la méthode equals () de la classe concrète est utilisée

Un cas particulièrement intéressant est lorsque vous comparez

  java.util.Arrays$ArrayList<[[name,value,type], [name1,value1,type1]]> 

et

  java.util.Collections$UnmodifiableCollection<[[name,value,type], [name1,value1,type1]]> 

Jusqu’à présent, la seule solution que je vois consiste à les transformer en ensembles

 assertEquals(new HashSet(customAtsortingbutes), new HashSet(result.getCustomAtsortingbutes())); 

Ou je pourrais les comparer élément par élément.

En tant que méthode supplémentaire basée sur des tableaux, vous pouvez envisager d’utiliser des assertions de tableaux non ordonnés dans junitx. Bien que l’exemple d’Apache CollectionUtils fonctionne, il existe également une extension d’extensions d’assertion solides:

Je pense que le

 ArrayAssert.assertEquivalenceArrays(new Integer[]{1,2,3}, new Integer[]{1,3,2}); 

l’approche sera beaucoup plus lisible et déboguable pour vous (toutes les collections prennent en charge toArray (), il devrait donc être assez facile d’utiliser les méthodes ArrayAssert.

Bien sûr, l’inconvénient est que junitx est un fichier jar supplémentaire ou une entrée maven …

   

Vérifiez cet article . Un exemple de là:

 @Test public void listEquality() { List expected = new ArrayList(); expected.add(5); List actual = new ArrayList(); actual.add(5); assertEquals(expected, actual); } 

En utilisant Hamcrest:

 assertThat( set1, both(everyItem(isIn(set2))).and(containsInAnyOrder(set1))); 

Cela fonctionne également lorsque les ensembles ont des types de données différents et génère des rapports sur la différence au lieu de simplement échouer.

Si vous voulez vérifier si une liste ou un ensemble contient un ensemble de valeurs spécifiques (au lieu de le comparer à une collection déjà existante), la méthode toSsortingng des collections est souvent pratique:

 Ssortingng[] actualResult = calltestedmethod(); assertEquals("[foo, bar]", Arrays.asList(actualResult).toSsortingng()); List otherResult = callothertestedmethod(); assertEquals("[42, mice]", otherResult.toSsortingng()); 

Ceci est un peu plus court que la première construction de la collection attendue et sa comparaison avec la collection réelle, et plus facile à écrire et à corriger.

(Certes, ce n’est pas une méthode particulièrement propre, et il est impossible de distinguer un élément “foo, bar” de deux éléments “foo” et “bar”. Mais dans la pratique, il est très important que les tests soient faciles et rapides. , sinon beaucoup de développeurs ne seront pas sans être pressés.)

J’aime la solution de Hans-Peter Störr … Mais je pense que ce n’est pas tout à fait correct. Malheureusement, InInAnyOrder n’accepte pas une Collection d’objects à comparer. Il doit donc s’agir d’une Collection de Matcher :

 assertThat(set1, containsInAnyOrder(set2.stream().map(IsEqual::equalTo).collect(toList()))) 

L’import sont:

 import static java.util.stream.Collectors.toList; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.junit.Assert.assertThat;