web-dev-qa-db-fra.com

CollectionAssert dans jUnit?

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

79
ripper234

En utilisant JUnit 4.4, vous pouvez utiliser assertThat() avec le code Hamcrest (ne vous inquiétez pas, il est livré avec JUnit, pas besoin de _ .jar) pour produire des assertions auto-descriptives complexes, 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 en cas d'échec.

120
Joachim Sauer

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

4
skaffman

Jetez un oeil à FEST Fluent Assertions. À mon humble avis, ils sont plus pratiques à utiliser que Hamcrest (et également puissants, extensibles, etc.) et ont un meilleur support IDE grâce à une interface fluide. Voir https://github.com/alexruiz /fest-assert-2.x/wiki/Using-fest-assertions

2
Tomek Kaczanowski

La solution de Joachim Sauer est Nice mais ne fonctionne pas si vous avez déjà un éventail d'attentes que vous souhaitez vérifier sont dans votre résultat. Cela peut apparaître lorsque vous avez déjà une attente générée ou constante dans vos tests à laquelle vous souhaitez comparer un résultat, ou peut-être avez-vous plusieurs attentes que vous prévoyez de fusionner dans le résultat. Ainsi, au lieu d'utiliser des matchers, vous pouvez simplement utiliser List::containsAll et 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
}
2
gavs