CollectionAssert à jUnit?
Question
Y at-il un parallèle JUnit au CollectionAssert
?
La solution
JUnit 4.4, vous pouvez utiliser assertThat()
avec le Hamcrest code (ne vous inquiétez pas, il est livré avec JUnit, pas besoin d'un .jar
supplémentaire) pour produire complexe auto-description, y compris ceux qui affirment opèrent sur les 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 automagiquement une bonne description de l'assertion quand il échoue.
Autres conseils
Pas directement, non. Je suggère l'utilisation de Hamcrest , qui fournit un ensemble de règles de correspondance qui intègre bien avec JUnit (et d'autres frameworks de test)
Jetez un oeil à FEST Courant Assertions. À mon humble avis, ils sont plus faciles à utiliser que Hamcrest (et tout aussi puissant, extensible, etc.) et ont de meilleures grâce de support IDE à interface fluide. Voir https://github.com/alexruiz/fest- affirmer-2.x / wiki / Utilisation-fest-assertions
La solution de Joachim Sauer est agréable mais ne dispose fonctionne pas si vous avez déjà un tableau d'attentes que vous souhaitez vérifier sont dans votre résultat. Cela peut arriver quand vous avez déjà une attente générée ou constante dans vos tests que vous voulez comparer un résultat, ou peut-être que vous avez plusieurs attentes que vous attendez à fusionner dans le résultat. Ainsi, au lieu d'utiliser matchers vous pouvez 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
}