web-dev-qa-db-fra.com

JUnit 4 compare Sets

Comment affirmeriez-vous succinctement l'égalité des éléments Collection, en particulier un élément Set dans JUnit 4?

95
Eqbal

Vous pouvez affirmer que les deux Sets sont égaux, ce qui invoque la méthode Setequals() .

public class SimpleTest {

    private Set<String> setA;
    private Set<String> setB;

    @Before
    public void setUp() {
        setA = new HashSet<String>();
        setA.add("Testing...");
        setB = new HashSet<String>();
        setB.add("Testing...");
    }

    @Test
    public void testEqualSets() {
        assertEquals( setA, setB );
    }
}

Cette @Test passera si les deux Sets ont la même taille et contiennent les mêmes éléments.

97
Bill the Lizard

Apache commons à nouveau à la rescousse.

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

Fonctionne comme un charme. Je ne sais pas pourquoi, mais j'ai constaté qu'avec les collections, la assertEquals(coll1, coll2) suivante ne fonctionne 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 sont égales bien que je sache avec certitude qu'elles le sont. En utilisant CollectionUtils cela fonctionne parfaitement.

40
Matt Friedman

avec hamcrest :

assertThat(s1, is(s2));

avec une simple affirmation:

assertEquals(s1, s2);

NB: t la méthode equals () de la classe de jeu concrets est utilisée

14
dfa

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 est de changer les deux en ensembles

assertEquals(new HashSet<CustomAttribute>(customAttributes), new HashSet<CustomAttribute>(result.getCustomAttributes()));

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

7
Arkadiy

En tant que méthode supplémentaire reposant sur un tableau, vous pouvez envisager d'utiliser des assertions de tableau non ordonnées dans junitx. Bien que l'exemple Apache CollectionUtils fonctionne, il existe également une série d'extensions d'assertions 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ébogable pour vous (toutes les Collections prennent en charge toArray (), il devrait donc être assez simple 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 ...

 <dependency org="junit-addons" name="junit-addons" rev="1.4"/>
4
jayunit100

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

@Test  
public void listEquality() {  
    List<Integer> expected = new ArrayList<Integer>();  
    expected.add(5);  

    List<Integer> actual = new ArrayList<Integer>();  
    actual.add(5);  

    assertEquals(expected, actual);  
}  
2
Roman

Utilisation de 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 rend compte de la différence au lieu d’échouer.

1

Si vous souhaitez vérifier si une liste ou un ensemble contient un ensemble de valeurs spécifiques (au lieu de le comparer à une collection existante), la méthode de collecte toString est souvent pratique:

String[] actualResult = calltestedmethod();
assertEquals("[foo, bar]", Arrays.asList(actualResult).toString());

List otherResult = callothertestedmethod();
assertEquals("[42, mice]", otherResult.toString());

Ceci est un peu plus court que la construction initiale 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 ne permet pas de distinguer un élément "foo, bar" de deux éléments "foo" et "bar". Mais en pratique, je pense qu'il est primordial de pouvoir écrire des tests facilement et rapidement. , sinon beaucoup de développeurs ne le feront pas sans être pressé.)

0
Hans-Peter Störr

J'aime la solution de Hans-Peter Störr ... Mais je pense que ce n'est pas tout à fait correct. Malheureusement, containsInAnyOrder n'accepte pas un Collection d'objets à comparer. Donc, il doit s'agir d'un Collection de Matchers:

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

Les importations sont:

import static Java.util.stream.Collectors.toList;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.junit.Assert.assertThat;
0
FLUXparticle