Überprüfen, ob eine Liste in Hamcrest nicht leer ist


147

Ich habe mich gefragt, ob jemand eine Möglichkeit kennt, mit assertThat()und zu überprüfen, ob eine Liste leer ist Matchers.

Der beste Weg, den ich sehen konnte, war, JUnit zu verwenden:

assertFalse(list.isEmpty());

Aber ich hatte gehofft, dass es in Hamcrest einen Weg gibt, dies zu tun.


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

2
@ FabricioLemos-Problem Nr. 97 scheint behoben zu sein und sich mit dem Master-Git-Zweig zu verbinden. Hoffen wir, dass es bald in der nächsten Hamcrest-Veröffentlichung sein wird.
Rafalmag

@rafalmag Guter Ort. Wird gut sein, um alle meine nicht so lesbaren Behauptungen zu
korrigieren,

Antworten:


165

Nun, es gibt immer

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

... aber ich vermute, das hast du nicht so gemeint :)

Alternative:

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

empty()ist eine statische in der MatchersKlasse. Beachten Sie die Notwendigkeit, werfen die listzu Collectiondank hamcrest 1.2 des wackelig Generika.

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.*;

6
Ich finde, dass Hamcrest-Code viel besser aussieht, wenn Sie Ihre Syntaxhervorhebung ändern, um die Klammer unsichtbar zu machen ...
Skaffman

2
@ tkeE2036: Das sind Hamcrests kaputte Generika bei der Arbeit. Manchmal müssen Sie Casting, um es zu kompilieren, zBassertThat((Collection)list, is(not(empty())));
Skaffman

7
Dies ist in 1.3
Artbristol

14
@dzieciou gibt es eine bessere Fehlermeldung, wenn der Test fehlschlägt. Also anstatt expected true but got falseSie bekommen so etwas wieexpected empty but got [1, 2, 3]
Brad Cupit

3
Wenn Sie keine ungeprüfte Konvertierung bevorzugen und bereit sind, den statischen Import aufzugeben, können Sie die Generika zur Methode hinzufügen, z. assertThat(list, Matchers.<String>empty())String
B

77

Dies ist 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())));

Wenn Sie jedoch eine ältere Version verwenden müssen, können Sie anstelle von Fehlern Folgendes empty()verwenden:

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.


1
@rogerdpack Los geht's. Ich habe das Beispiel im Stil 1.3 hinzugefügt. :)
Rafalmag

1
assertThat(list, not(hasSize(0)))listnullassertThat(list, hasSize(greaterThan(0)))
Beachten

5

Wenn Sie nach lesbaren Fehlermeldungen suchen, können Sie auf hamcrest verzichten, indem Sie die üblichen 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]

2
Es ist wirklich schön zu sehen, was in der vermeintlich leeren Liste noch übrig war!
HDave

0

Erstellen Sie Ihren eigenen IsEmpty TypeSafeMatcher:

Selbst wenn die generischen Probleme in 1.3der großartigen Sache an dieser Methode behoben sind, funktioniert sie für jede Klasse, die eine isEmpty()Methode hat! Nicht nur Collections!

Zum Beispiel wird es auch funktionieren String!

/* 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"); }
}

0

Das funktioniert:

assertThat(list,IsEmptyCollection.empty())
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.