JUnit 4 vergleichen Sets

Lesezeit: 4 Minuten

Benutzer-Avatar
Eqbal

Wie würden Sie prägnant die Gleichheit von behaupten Collection Elemente, insbesondere a Set in JUnit 4?

  • Ü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

Benutzer-Avatar
Bill die Eidechse

Das können die beiden behaupten Sets 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 Sets 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 und hashCode 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


Benutzer-Avatar
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"/>

Benutzer-Avatar
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

1311200cookie-checkJUnit 4 vergleichen Sets

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy