CollectionAssert in jUnit?
Frage
Gibt es eine jUnit parallel zu NUnit CollectionAssert
?
Lösung
Mit JUnit 4.4 Sie assertThat()
zusammen mit dem hamcrest Code (keine Sorge verwenden können, ist es im Lieferumfang JUnit, keine Notwendigkeit für eine zusätzliche .jar
) zu erzeugen komplexe selbstbeschreibende behauptet darunter auch solche, die auf Sammlungen arbeiten:
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"))));
Mit diesem Ansatz werden Sie automatisch eine gute Beschreibung des assert erhalten, wenn es nicht.
Andere Tipps
Nicht direkt, nein. Ich schlage vor, die Verwendung von hamcrest , die eine reiche Reihe von passenden Regeln liefert, die gut mit jUnit integriert (und andere Test-Frameworks)
Hier finden Sie aktuelle FEST Fluent Assertions. IMHO sind sie bequemer als hamcrest zu verwenden (und ebenso leistungsstarke, erweiterbare usw.) und eine bessere IDE-Unterstützung dank fließend Schnittstelle. Siehe https://github.com/alexruiz/fest- behaupten-2.x / wiki / Verwenden-fest-Behauptungen
Joachim Sauer-Lösung ist schön, aber nicht funktioniert, wenn Sie bereits eine Reihe von Erwartungen, die Sie in Ihr Ergebnis überprüfen möchten sind. Dies könnte kommen, wenn Sie bereits eine generierte oder konstante Erwartung in Ihren Tests haben, dass Sie ein Ergebnis, vergleichen wollen oder Sie haben vielleicht mehrere Erwartungen, die Sie erwarten in der Folge zusammengeführt werden. Anstatt also Matcher verwenden können Sie nur verwenden List::containsAll
und assertTrue
Beispiel:
@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
}