Wie würden Sie die Gleichheit der Collection
Elemente, insbesondere a Set
in JUnit 4, kurz und bündig behaupten ?
Wie würden Sie die Gleichheit der Collection
Elemente, insbesondere a Set
in JUnit 4, kurz und bündig behaupten ?
Antworten:
Sie können behaupten, dass die beiden Set
s gleich sind, wodurch die Set
equals()
Methode aufgerufen wird .
public class SimpleTest {
private Set<String> setA;
private Set<String> setB;
@Before
public void setUp() {
setA = new HashSet<String>();
setA.add("Testing...");
setB = new HashSet<String>();
setB.add("Testing...");
}
@Test
public void testEqualSets() {
assertEquals( setA, setB );
}
}
Dies @Test
ist erfolgreich, wenn die beiden Set
s dieselbe Größe haben und dieselben Elemente enthalten.
equals
und hashCode
in der Klasse implementiert , dass Sie in Ihrem Hashtable sind speichern?
Apache kommt wieder zur Rettung.
assertTrue(CollectionUtils.isEqualCollection(coll1, coll2));
Klappt wunderbar. Ich weiß nicht warum, aber ich habe festgestellt, dass bei Sammlungen Folgendes assertEquals(coll1, coll2)
nicht immer funktioniert. Für den Fall, dass es für mich fehlschlug, hatte ich zwei Sammlungen, die von Sets unterstützt wurden. Weder Hamcrest noch Junit würden sagen, dass die Sammlungen gleich waren, obwohl ich sicher wusste, dass sie es waren. Mit CollectionUtils funktioniert es perfekt.
mit hamcrest :
assertThat(s1, is(s2));
mit klarer Behauptung:
assertEquals(s1, s2);
NB: t Die Methode equals () der konkreten Mengenklasse wird verwendet
Ein besonders interessanter Fall ist der Vergleich
java.util.Arrays$ArrayList<[[name,value,type], [name1,value1,type1]]>
und
java.util.Collections$UnmodifiableCollection<[[name,value,type], [name1,value1,type1]]>
Bisher sehe ich nur die Lösung, beide in Sets umzuwandeln
assertEquals(new HashSet<CustomAttribute>(customAttributes), new HashSet<CustomAttribute>(result.getCustomAttributes()));
Oder ich könnte sie Element für Element vergleichen.
Als zusätzliche Methode, die auf Arrays basiert, können Sie die Verwendung ungeordneter Array-Zusicherungen in junitx in Betracht ziehen. Obwohl das Beispiel Apache CollectionUtils funktioniert, gibt es dort auch eine Reihe solider Assertion-Erweiterungen:
ich glaube, dass der
ArrayAssert.assertEquivalenceArrays(new Integer[]{1,2,3}, new Integer[]{1,3,2});
Der Ansatz ist für Sie viel besser lesbar und debuggbar (alle Sammlungen unterstützen toArray (), daher sollte es einfach genug sein, die ArrayAssert-Methoden zu verwenden.
Der Nachteil hierbei ist natürlich, dass junitx eine zusätzliche JAR-Datei oder ein Maven-Eintrag ist ...
<dependency org="junit-addons" name="junit-addons" rev="1.4"/>
Überprüfen Sie diesen Artikel . Ein Beispiel von dort:
@Test
public void listEquality() {
List<Integer> expected = new ArrayList<Integer>();
expected.add(5);
List<Integer> actual = new ArrayList<Integer>();
actual.add(5);
assertEquals(expected, actual);
}
Verwenden von Hamcrest:
assertThat( set1, both(everyItem(isIn(set2))).and(containsInAnyOrder(set1)));
Dies funktioniert auch, wenn die Sets unterschiedliche Datentypen haben und über den Unterschied berichten, anstatt nur zu versagen.
Wenn Sie überprüfen möchten, ob eine Liste oder ein Satz einen Satz bestimmter Werte enthält (anstatt ihn mit einer bereits vorhandenen Sammlung zu vergleichen), ist häufig die toString-Methode für Sammlungen hilfreich:
String[] actualResult = calltestedmethod();
assertEquals("[foo, bar]", Arrays.asList(actualResult).toString());
List otherResult = callothertestedmethod();
assertEquals("[42, mice]", otherResult.toString());
Dies ist etwas kürzer als das erste Erstellen der erwarteten Sammlung und der Vergleich mit der tatsächlichen Sammlung und einfacher zu schreiben und zu korrigieren.
(Zugegeben, dies ist keine besonders saubere Methode und kann ein Element "foo, bar" nicht von zwei Elementen "foo" und "bar" unterscheiden. In der Praxis halte ich es jedoch für das Wichtigste, dass es einfach und schnell ist, Tests zu schreiben , sonst werden viele Entwickler einfach nicht ohne Druck.)
Ich mag die Lösung von Hans-Peter Störr ... Aber ich denke, es ist nicht ganz richtig. Leider containsInAnyOrder
nicht Akzeptierte Collection
von objetcs zu vergleichen. Also muss es ein Collection
von Matcher
s sein:
assertThat(set1, containsInAnyOrder(set2.stream().map(IsEqual::equalTo).collect(toList())))
Die Importe sind:
import static java.util.stream.Collectors.toList;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.junit.Assert.assertThat;