Wie würden Sie prägnant die Gleichheit von behaupten Collection
Elemente, insbesondere a Set
in JUnit 4?
JUnit 4 vergleichen Sets
Eqbal
Bill die Eidechse
Das können die beiden behaupten Set
s sind einander gleich, wodurch die aufgerufen wird Set
equals()
Methode.
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
wird passieren, wenn die beiden Set
s sind gleich groß und enthalten die gleichen Elemente.
-
Dies zeigt keine sehr guten Ergebnisse im Bericht an. Wenn Ihre toStrings klar definiert sind, ist es besser, aber immer noch nicht gut (Ein kleiner Unterschied kann mit einer Seite Text enden)
– Bill K
17. September 2012 um 18:13 Uhr
-
Ähm, wie kommt es, dass ich bekomme: java.lang.AssertionError: erwartet: java.util.Hashtable<{CompanyName=8PKQ9va3nW8pRWb4SjPF2DvdQDBmlZ, Ric=sZwmXAdYKv, Category=AvrIfd, QuoteId=4342740204922826921}> war aber: java.util.Hashtable<{CompanyName =8PKQ9va3nW8pRWb4SjPF2DvdQDBmlZ, Ric=sZwmXAdYKv, Kategorie=AvrIfd, QuoteId=4342740204922826921}>
– Giovanni Botta
28. März 2013 um 15:27 Uhr
-
@Giodude Hast du
equals
undhashCode
in der Klasse implementiert, die Sie in Ihrer Hashtable speichern?– Bill die Eidechse
28. März 2013 um 15:40 Uhr
-
Wie Sie sehen können, sind das nur Zeichenfolgen und ein langer … Ich teste Avro, um eine Karte zu serialisieren und zu deserialisieren, und das ist das Ergebnis. Ich denke, es muss etwas faul sein, wie die Zeichenfolgen serialisiert und deserialisiert werden, wodurch der Test fehlschlägt, aber ich kann das Problem anscheinend nicht finden.
– Giovanni Botta
28. März 2013 um 17:35 Uhr
-
Hat bei mir nicht funktioniert, obwohl ich zwei HashSet
vergleiche. Die Antwort von @MattFriedman funktioniert tatsächlich für meinen Anwendungsfall. – bluecollarcoder
6. November 2014 um 0:28 Uhr
Matt Friedmann
Apache Commons wieder zur Rettung.
assertTrue(CollectionUtils.isEqualCollection(coll1, coll2));
Klappt wunderbar. Ich weiß nicht warum, aber ich habe das mit den folgenden Sammlungen gefunden assertEquals(coll1, coll2)
funktioniert nicht immer. Für den Fall, dass es bei mir 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 mir sicher war, dass sie es waren. Mit CollectionUtils funktioniert es perfekt.
-
Das ist eigentlich trivial, der knifflige Teil besteht darin, dem Anrufer den Unterschied deutlich zu machen
– Bill K
17. September 2012 um 18:15 Uhr
-
Die akzeptierte Antwort ist eine gute Antwort auf die ursprüngliche Frage (Einheitentest speziell für zwei Sets), aber diese Antwort mit CollectionUtils ist meiner Meinung nach eine bessere Antwort für den allgemeinsten Fall. Ich war nicht in der Lage, eine Sammlung und ein Set zu vergleichen, es sei denn, ich habe CollectionUtils verwendet.
– Jason
15. März 2017 um 9:46 Uhr
mit Oberschenkel:
assertThat(s1, is(s2));
mit einfach behaupten:
assertEquals(s1, s2);
NB:t die Methode equals() der konkrete set klasse wird genutzt
-
Ich bevorzuge diese Methode, da Hamcrest mit JUnit 4 geliefert wird, sodass keine anderen Bibliotheken erforderlich sind.
– JRSofty
25. Januar 2016 um 13:19 Uhr
-
Dies funktioniert möglicherweise nicht, wenn die Sätze unterschiedliche Typen haben.
– Hans-Peter Störr
24. Mai 2017 um 15:51 Uhr
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 als einzige Lösung darin, 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 in Betracht ziehen, ungeordnete Array-Assertionen in junitx zu verwenden. Obwohl das Apache CollectionUtils-Beispiel funktionieren wird, gibt es dort auch ein Paket solider Assertion-Erweiterungen:
ich glaube, dass der
ArrayAssert.assertEquivalenceArrays(new Integer[]{1,2,3}, new Integer[]{1,3,2});
-Ansatz für Sie viel besser lesbar und debuggbar sein (alle Sammlungen unterstützen toArray(), daher sollte es einfach genug sein, die ArrayAssert-Methoden zu verwenden.
Der Nachteil hier 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"/>
doppelter Piepton
Prüfen Dieser 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);
}
Verwendung von Hamcrest:
assertThat( set1, both(everyItem(isIn(set2))).and(containsInAnyOrder(set1)));
Dies funktioniert auch, wenn die Sets unterschiedliche Datentypen haben, und berichtet über den Unterschied, anstatt nur zu scheitern.
-
Was ist der Import für isIn? IntelliJ kann den Import mit keinem Hamcret-Paket auflösen.
– Fabien
10. Dezember 2017 um 18:09 Uhr
Überprüfen Sie diesen SO-Post stackoverflow.com/questions/1086691/collectionassert-in-junit
– Teja Kantamneni
22. Februar 2010 um 18:46 Uhr
Versuchen Sie zu behaupten, dass zwei Mengen einander gleich sind (die gleichen Elemente enthalten) oder dass zwei Elemente derselben Menge gleich sind?
– Bill die Eidechse
22. Februar 2010 um 18:55 Uhr
Ich muss sehen, dass die Elemente zweier Mengen gleich sind
– Eqbal
22. Februar 2010 um 18:58 Uhr