2017-10-17 10 views
1

Je veux tester si une liste de chaînes est générée correctement en créant des tests unitaires en utilisant JUnit.Compare 2 Liste <String> si elles contiennent les mêmes éléments dans n'importe quel ordre [JUnit - Asset]

J'ai 2 listes de chaînes (une liste dans mon code est static privé, disons list1) avec les mêmes éléments (les mêmes éléments peuvent se multiplier) dans un ordre différent:

List<String> list1 = Arrays.asList("a","b","c"); 
List<String> list2 = Arrays.asList("c","a","b"); 
assertThat(list1 , containsInAnyOrder(list2)); 

C'est ne fonctionne pas et le test de junit renvoie que le premier élément ne correspond pas.

J'utilise probablement la méthode containsInAnyOrder erronée.

containsInAnyOrder(java.util.Collection<Matcher<? super T>> itemMatchers) 

Je ne sais pas comment implémenter ce Matcher.

Je ne veux pas utiliser ce type de fonction car il est seulement correct pour une petite quantité d'éléments:

containsInAnyOrder(T... items) 

Répondre

2
assertEquals(new HashSet<String>(list1), new HashSet<String>(list2)); 
assertEquals(new HashSet<String>(list1).containsAll(new HashSet<String>(list2))); 
+1

Cela ne tient cependant pas compte des éléments répétés. Je pense que la réponse de @ MehrajMalik fonctionne mieux. –

+0

@LeoAso oui en effet –

1

Cela dépend si vous vous attendez à avoir double emploi ou non.

S'il n'y a pas de duplication 1 option simple utilise Set - deux ensembles sont égaux les uns aux autres en utilisant equals() et utiliser assertEquals(setA, setB);

Il y a plus de moyens « primitifs » (en utilisant HashMap pour chaque valeur unique et comparer les répétition de chacun) de le faire, mais pour ce que vous cherchez chèque this answer

0

Je trouve ce code dans un tutorial about unit tests:

assertThat(list1, containsInAnyOrder("c", "b", "a"));  

méthode complète pour les listes de tests:

@Test 
public void testAssertList() { 

    List<String> actual = Arrays.asList("a", "b", "c"); 
    List<String> expected = Arrays.asList("a", "b", "c"); 

    //All passed/true 

    //1. Test equal. 
    assertThat(actual, is(expected)); 

    //2. If List has this value? 
    assertThat(actual, hasItems("b")); 

    //3. Check List Size 
    assertThat(actual, hasSize(3)); 

    assertThat(actual.size(), is(3)); 

    //4. List order 

    // Ensure Correct order 
    assertThat(actual, contains("a", "b", "c")); 

    // Can be any order 
    assertThat(actual, containsInAnyOrder("c", "b", "a")); 

    //5. check empty list 
    assertThat(actual, not(IsEmptyCollection.empty())); 

    assertThat(new ArrayList<>(), IsEmptyCollection.empty()); 

} 

Votre test est probablement échoué parce que list1 ne contient pas réellement list2, mais contient les éléments list2

3

Vous pouvez d'abord trier à la fois la List puis comparer la trié List s.

List<String> list1 = Arrays.asList("a","b","c"); 
List<String> list2 = Arrays.asList("c","a","b",); 
Collections.sort(list1); 
Collections.sort(list2); 
assertEquals(list1, list2); // true 
0

Jusqu'à présent, c'est la solution la plus universelle sans jeux, tri supplémentaire, ...

assertThat(list1, containsInAnyOrder(list2.toArray())); 

Mais je veux toujours savoir comment mettre en œuvre cet appel:

containsInAnyOrder(java.util.Collection<Matcher<? super T>> itemMatchers) 
+0

Essayez 'containsInAnyOrder (isIn (list2))' Ne gèrera pas les entrées dupliquées, car 'containsInAnyOrder' ne se soucie pas des doublons. – Sgene9

+1

Le "InAnyOrder" n'est pas destiné aux éléments de la liste mais aux correspondants. Il est dit que, étant donné plusieurs coupleurs, chaque élément peut satisfaire n'importe quel match dans n'importe quel ordre. – Sgene9