86 votes

CollectionAssert dans jUnit ?

Existe-t-il un jUnit parallèle à celui de NUnit ? CollectionAssert ?

127voto

Joachim Sauer Points 133411

En utilisant JUnit 4.4, vous pouvez utiliser assertThat() avec le Hamcrest (ne vous inquiétez pas, il est livré avec JUnit, pas besoin d'un code supplémentaire). .jar ) pour produire des assertions complexes auto-décrites, y compris celles qui opèrent sur des collections :

import static org.junit.Assert.assertThat;
import static org.junit.matchers.JUnitMatchers.*;
import static org.hamcrest.CoreMatchers.*;

List<String> l = Arrays.asList("foo", "bar");
assertThat(l, hasItems("foo", "bar"));
assertThat(l, not(hasItem((String) null)));
assertThat(l, not(hasItems("bar", "quux")));
// check if two objects are equal with assertThat()

// the following three lines of code check the same thing.
// the first one is the "traditional" approach,
// the second one is the succinct version and the third one the verbose one 
assertEquals(l, Arrays.asList("foo", "bar")));
assertThat(l, is(Arrays.asList("foo", "bar")));
assertThat(l, is(equalTo(Arrays.asList("foo", "bar"))));

En utilisant cette approche, vous obtiendrez automatiquement une bonne description de l'assertion lorsqu'elle échoue.

1 votes

Ooh, je n'avais pas réalisé que Hamcrest avait fait son entrée dans la distro junit. Allez Nat !

0 votes

Si je veux affirmer que l est composé d'éléments ("foo", "bar"), mais qu'aucun autre élément n'existe, existe-t-il une syntaxe simple pour cela ?

0 votes

Utilisez l'extrait de code ci-dessus et ajoutez un assertTrue(l.size() == 2).

4voto

skaffman Points 197885

Pas directement, non. Je suggère l'utilisation de Hamcrest qui fournit un riche ensemble de règles de correspondance qui s'intègrent parfaitement à jUnit (et à d'autres cadres de test).

0 votes

Cela ne compile pas pour une raison quelconque (voir stackoverflow.com/questions/1092981/hamcrests-hasitems ) : ArrayList<Integer> actual = new ArrayList<Integer>() ; ArrayList<Integer> expected = new ArrayList<Integer>() ; actual.add(1) ; expected.add(2) ; assertThat(actual, hasItems(expected)) ;

2voto

Tomek Kaczanowski Points 113

Jetez un coup d'œil à FEST Fluent Assertions. Je pense qu'elles sont plus pratiques à utiliser que Hamcrest (et tout aussi puissantes, extensibles, etc.) et ont un meilleur support IDE grâce à leur interface fluide. Voir https://github.com/alexruiz/fest-assert-2.x/wiki/Using-fest-assertions

0 votes

En 2017, il semble que davantage de personnes utilisent une branche de FEST appelée AssertJ.

2voto

gavs Points 11

La solution de Joachim Sauer est intéressante mais ne fonctionne pas si vous avez déjà un tableau d'attentes que vous voulez vérifier dans votre résultat. Cela peut se produire lorsque vous avez déjà une attente générée ou constante dans vos tests à laquelle vous voulez comparer un résultat, ou peut-être que vous avez plusieurs attentes qui devraient être fusionnées dans le résultat. Ainsi, au lieu d'utiliser des matchers, vous pouvez simplement utiliser List::containsAll y assertTrue Par exemple :

@Test
public void testMerge() {
    final List<String> expected1 = ImmutableList.of("a", "b", "c");
    final List<String> expected2 = ImmutableList.of("x", "y", "z");
    final List<String> result = someMethodToTest(); 

    assertThat(result, hasItems(expected1)); // COMPILE ERROR; DOES NOT WORK
    assertThat(result, hasItems(expected2)); // COMPILE ERROR; DOES NOT WORK

    assertTrue(result.containsAll(expected1));  // works~ but has less fancy
    assertTrue(result.containsAll(expected2));  // works~ but has less fancy
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X