Comment affirmeriez-vous succinctement l'égalité des Collection
éléments, en particulier a Set
dans JUnit 4?
Comment affirmeriez-vous succinctement l'égalité des Collection
éléments, en particulier a Set
dans JUnit 4?
Réponses:
Vous pouvez affirmer que les deux Set
s sont égaux l'un à l'autre, ce qui appelle la Set
equals()
méthode .
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 );
}
}
Cela @Test
passera si les deux Set
s sont de la même taille et contiennent les mêmes éléments.
equals
et hashCode
implémenté dans la classe que vous stockez dans votre Hashtable?
Apache commons à nouveau à la rescousse.
assertTrue(CollectionUtils.isEqualCollection(coll1, coll2));
Fonctionne comme un charme. Je ne sais pas pourquoi mais j'ai trouvé qu'avec les collections, ce qui suit assertEquals(coll1, coll2)
ne fonctionne pas toujours. Dans le cas où cela a échoué pour moi, j'avais deux collections soutenues par des ensembles. Ni hamcrest ni junit ne diraient que les collections étaient égales même si je savais avec certitude qu'elles l'étaient. En utilisant CollectionUtils, cela fonctionne parfaitement.
avec hamcrest :
assertThat(s1, is(s2));
avec une affirmation claire:
assertEquals(s1, s2);
NB: t la méthode equals () de la classe d'ensemble concrète est utilisée
Un cas particulièrement intéressant est celui de la comparaison
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 basée 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 un ensemble 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é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 ...
<dependency org="junit-addons" name="junit-addons" rev="1.4"/>
Consultez 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 signale la différence au lieu de simplement échouer.
Si vous souhaitez vérifier si une liste ou un ensemble contient un ensemble de valeurs spécifiques (au lieu de le comparer avec une collection déjà existante), la méthode toString des collections est souvent pratique:
String[] actualResult = calltestedmethod();
assertEquals("[foo, bar]", Arrays.asList(actualResult).toString());
List otherResult = callothertestedmethod();
assertEquals("[42, mice]", otherResult.toString());
C'est un peu plus court que de commencer par construire la collection attendue et de la comparer avec la collection réelle, et plus facile à écrire et à corriger.
(Certes, ce n'est pas une méthode particulièrement propre, et ne peut pas distinguer un élément "foo, bar" de deux éléments "foo" et "bar". Mais en pratique, je pense qu'il est le plus important qu'il soit facile et rapide d'écrire des tests , sinon de nombreux développeurs ne le feront pas sans être pressés.)
J'aime la solution de Hans-Peter Störr ... Mais je pense qu'elle n'est pas tout à fait correcte. containsInAnyOrder
N'accepte malheureusement pas un Collection
des objets à comparer. Il faut donc que ce soit 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;