Comment affirmeriez-vous succinctement l'égalité des éléments Collection
, en particulier un élément Set
dans JUnit 4?
Vous pouvez affirmer que les deux Set
s sont égaux, ce qui invoque la méthode Set
equals()
.
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 Set
s ont la même taille et contiennent les mêmes éléments.
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.
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
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.
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"/>
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);
}
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.
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é.)
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 Matcher
s:
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;