Esiste una jUnit parallela a quella di NUnit CollectionAssert
?
Esiste una jUnit parallela a quella di NUnit CollectionAssert
?
Risposte:
Usando JUnit 4.4 puoi usare assertThat()
insieme al codice Hamcrest (non preoccuparti, viene fornito con JUnit, non c'è bisogno di un extra .jar
) per produrre asserzioni auto-descrittive complesse, comprese quelle che operano sulle collezioni:
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"))));
Usando questo approccio otterrai automaticamente una buona descrizione dell'asserzione quando fallisce.
Non direttamente, no. Suggerisco l'uso di Hamcrest , che fornisce un ricco set di regole di corrispondenza che si integra perfettamente con jUnit (e altri framework di test)
Dai un'occhiata a FEST Fluent Assertions. IMHO sono più comodi da usare di Hamcrest (e altrettanto potenti, estensibili, ecc.) E hanno un migliore supporto IDE grazie all'interfaccia fluente. Vedi https://github.com/alexruiz/fest-assert-2.x/wiki/Using-fest-assertions
La soluzione di Joachim Sauer è carina ma non funziona se hai già una serie di aspettative che vuoi verificare siano nel tuo risultato. Questo potrebbe accadere quando hai già un'aspettativa generata o costante nei tuoi test con cui vuoi confrontare un risultato, o forse hai più aspettative che ti aspetti di essere unite nel risultato. Quindi, invece di usare i matcher puoi semplicemente usare List::containsAll
e assertTrue
For Example:
@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
}
hasItems(expected1.toArray(new String[expected1.size()]))
. Ti darà messaggi di errore migliori.