Prüfen, ob eine Liste in Hamcrest nicht leer ist

Lesezeit: 4 Minuten

Benutzer-Avatar
Ian Dallas

Ich habe mich gefragt, ob jemand einen Weg kennt, um zu überprüfen, ob eine Liste leer ist assertThat() und Matchers?

Am besten verwende ich einfach JUnit:

assertFalse(list.isEmpty());

Aber ich hatte gehofft, dass es in Hamcrest eine Möglichkeit gibt, dies zu tun.

  • Für eine bessere Lösung stimmen Sie für: code.google.com/p/hamcrest/issues/detail?id=97

    – Fabricio Lemos

    2. Oktober 2010 um 15:40 Uhr

  • @FabricioLemos Issue # 97 scheint gelöst und mit dem Master-Git-Zweig zusammengeführt zu sein. Hoffen wir, dass es bald in der nächsten Hamcrest-Veröffentlichung erscheinen wird.

    – Rafalmag

    13. Mai 2012 um 19:34 Uhr

  • @rafalmag Gute Stelle. Wird gut sein, alle meine nicht so lesbaren Behauptungen zu beheben, wenn v1.3 veröffentlicht wird

    – andyb

    25. Mai 2012 um 15:33 Uhr

Benutzer-Avatar
Skaffmann

Nun, es gibt immer

assertThat(list.isEmpty(), is(false));

… aber ich schätze, das ist nicht ganz das, was du meinst 🙂

Alternative:

assertThat((Collection)list, is(not(empty())));

empty() ist eine Statik in der Matchers Klasse. Beachten Sie die Notwendigkeit, die zu werfen list zu Collectiondank der wackeligen Generika von Hamcrest 1.2.

Die folgenden Importe können mit hamcrest 1.3 verwendet werden

import static org.hamcrest.Matchers.empty;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsNot.*;

  • Ich finde, dass Hamcrest-Code viel schöner aussieht, wenn Sie Ihre Syntaxhervorhebung ändern, um die Klammern unsichtbar zu machen …

    – Skaffmann

    2. September 2010 um 20:53 Uhr

  • @tkeE2036: Das sind die kaputten Generika von Hamcrest bei der Arbeit. Manchmal müssen Sie umwandeln, damit es kompiliert wird, z assertThat((Collection)list, is(not(empty())));

    – Skaffmann

    2. September 2010 um 21:46 Uhr

  • @dzieciou es gibt Ihnen eine bessere Fehlermeldung, wenn der Test fehlschlägt. Also statt expected true but got false du bekommst sowas wie expected empty but got [1, 2, 3]

    – Brad Cupit

    22. Oktober 2012 um 14:10 Uhr

  • Wenn Sie keine ungeprüfte Konvertierung bevorzugen und bereit sind, auf den statischen Import zu verzichten, können Sie die Generics zur Methode hinzufügen, wie z. assertThat(list, Matchers.<String>empty()) (vorausgesetzt, die Liste ist eine Sammlung von Strings)

    – Ohrkamera

    18. Juni 2013 um 3:03 Uhr


  • @Ian diese Antwort ist veraltet und es gibt bessere Antworten, die jetzt stattdessen akzeptiert werden sollten.

    Benutzer177800

    15. September 2015 um 1:45 Uhr

Benutzer-Avatar
Rafalmag

Dies wurde in Hamcrest 1.3 behoben. Der folgende Code wird kompiliert und generiert keine Warnungen:

// given
List<String> list = new ArrayList<String>();
// then
assertThat(list, is(not(empty())));

Aber wenn Sie ältere Version verwenden müssen – statt verwanzt empty() Du könntest benutzen:

hasSize(greaterThan(0))

(import static org.hamcrest.number.OrderingComparison.greaterThan; oder
import static org.hamcrest.Matchers.greaterThan;)

Beispiel:

// given
List<String> list = new ArrayList<String>();
// then
assertThat(list, hasSize(greaterThan(0)));

Das Wichtigste an den oben genannten Lösungen ist, dass keine Warnungen generiert werden. Die zweite Lösung ist noch nützlicher, wenn Sie die minimale Ergebnisgröße schätzen möchten.

  • @rogerdpack Bitte schön. Ich habe das Beispiel im 1.3-Stil hinzugefügt. 🙂

    – Rafalmag

    9. Dezember 2015 um 22:20 Uhr

Wenn Sie auf lesbare Fehlermeldungen aus sind, können Sie auf Hamcrest verzichten, indem Sie das übliche assertEquals mit einer leeren Liste verwenden:

assertEquals(new ArrayList<>(0), yourList);

zB wenn du rennst

assertEquals(new ArrayList<>(0), Arrays.asList("foo", "bar");

du erhältst

java.lang.AssertionError
Expected :[]
Actual   :[foo, bar]

  • Es ist wirklich schön zu sehen, was in der vermeintlich leeren Liste übrig geblieben ist!

    – David

    1. Oktober 2014 um 13:55 Uhr


Erstellen Sie Ihren eigenen benutzerdefinierten IsEmpty TypeSafeMatcher:

Auch wenn die Generika-Probleme behoben sind 1.3 Das Tolle an dieser Methode ist, dass sie für jede Klasse funktioniert, die eine hat isEmpty() Methode! Nicht nur Collections!

Zum Beispiel wird es weiter funktionieren String auch!

/* Matches any class that has an <code>isEmpty()</code> method
 * that returns a <code>boolean</code> */ 
public class IsEmpty<T> extends TypeSafeMatcher<T>
{
    @Factory
    public static <T> Matcher<T> empty()
    {
        return new IsEmpty<T>();
    }

    @Override
    protected boolean matchesSafely(@Nonnull final T item)
    {
        try { return (boolean) item.getClass().getMethod("isEmpty", (Class<?>[]) null).invoke(item); }
        catch (final NoSuchMethodException e) { return false; }
        catch (final InvocationTargetException | IllegalAccessException e) { throw new RuntimeException(e); }
    }

    @Override
    public void describeTo(@Nonnull final Description description) { description.appendText("is empty"); }
}

Das funktioniert:

assertThat(list,IsEmptyCollection.empty())

1343020cookie-checkPrüfen, ob eine Liste in Hamcrest nicht leer ist

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

Privacy policy