Frage an junit, assertion, java, nunit – CollectionAssert in jUnit?

72

Gibt es eine jUnit parallel zu NUnitCollectionAssert?

Deine Antwort

4   die antwort
115

Mit JUnit 4.4 können Sie verwendenassertThat() zusammen mit demHamcrest Code (keine Sorge, er wird mit JUnit ausgeliefert, es ist kein zusätzlicher Code erforderlich.jar) komplexe selbstbeschreibende Aussagen zu erstellen, einschließlich solcher, die Sammlungen bearbeiten:

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 erhalten Sie automatisch eine gute Beschreibung der Zusicherung, wenn sie fehlschlägt.

Sie können Ihre eigene CollectionAssert.AreEqual (Collection col1, Collection col2) anhand des obigen Beispiels schreiben. Sie werden ungefähr 5 Minuten brauchen, um dies zu machen. Vanger
"das zweite ist die prägnante Version" - es ist 1 Zeichen weniger prägnant als der "traditionelle" Ansatz! bacar
Ist das nicht einfach assertTrue (collection1.equals (collection2))? ? Esko
Verwenden Sie das obige Code-Snippet und fügen Sie eine zusätzliche assertTrue (l.size () == 2) hinzu. aberrant80
1

funktioniert aber nicht, wenn Sie bereits eine Reihe von Erwartungen an Ihr Ergebnis haben, die Sie überprüfen möchten. Dies kann auftreten, wenn Sie in Ihren Tests bereits eine generierte oder konstante Erwartung haben, mit der Sie ein Ergebnis vergleichen möchten, oder wenn Sie mehrere Erwartungen haben, die Sie für das Ergebnis erwarten. Anstatt also Matcher zu verwenden, können Sie auch nur Matcher verwendenList::containsAll undassertTrue Zum 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
}
4

Hamcrest, das eine Fülle von Übereinstimmungsregeln bietet, die sich gut in jUnit (und andere Test-Frameworks) integrieren lassen

Dies wird aus irgendeinem Grund nicht kompiliert (siehestackoverflow.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 (erwartet)); ripper234
2

bedienen als Hamcrest (und ebenso leistungsfähig, erweiterbar usw.) und haben dank der fließenden Benutzeroberfläche eine bessere IDE-Unterstützung. Sehenhttps://github.com/alexruiz/fest-assert-2.x/wiki/Using-fest-assertions

Im Jahr 2017 scheint es, dass immer mehr Menschen einen Zweig von FEST mit dem Namen AssertJ nutzen. Max

Verwandte Fragen