Verifica che un elenco non sia vuoto in Hamcrest


147

Mi chiedevo se qualcuno fosse a conoscenza di un modo per verificare se una Lista è vuota usando assertThat()e Matchers?

Il modo migliore che ho potuto vedere basta usare JUnit:

assertFalse(list.isEmpty());

Ma speravo che ci fosse un modo per farlo in Hamcrest.


2
Per una soluzione migliore, vota per: code.google.com/p/hamcrest/issues/detail?id=97
Fabricio Lemos

2
Il problema n. 97 di @FabricioLemos sembra essere stato risolto e unito al master git branch. Speriamo che sarà presto nella prossima versione più amara.
rafalmag,

@rafalmag Buon posto. Sarà utile correggere tutte le mie asserzioni non così leggibili quando verrà rilasciata v1.3
andyb

Risposte:


165

Bene c'è sempre

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

... ma suppongo che non sia esattamente quello che volevi dire :)

In alternativa:

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

empty()è un statico nella Matchersclasse. Nota la necessità di lanciare il listto Collection, grazie ai generici traballanti di Hamcrest 1.2.

Le seguenti importazioni possono essere utilizzate con hamcrest 1.3

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

6
Trovo che il codice Hamcrest sia molto più bello se cambi l'evidenziazione della sintassi per rendere invisibile la parentesi ...
skaffman,

2
@ tkeE2036: Ecco i generici rotti di Hamcrest al lavoro. A volte è necessario eseguire il cast per farlo compilare, ad esempioassertThat((Collection)list, is(not(empty())));
skaffman

7
Il
problema

14
@dzieciou ti dà un messaggio di errore migliore quando il test fallisce. Quindi invece di expected true but got falseottenere qualcosa del genereexpected empty but got [1, 2, 3]
Brad Cupit,

3
Se non si preferisce alcuna conversione non selezionata e si desidera rinunciare all'importazione statica, è possibile aggiungere i generici al metodo, come: assertThat(list, Matchers.<String>empty())(supponendo che l'elenco sia una raccolta di Strings)
earcam

77

Questo problema è stato risolto in Hamcrest 1.3. Il codice seguente viene compilato e non genera alcun avviso:

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

Ma se devi usare una versione precedente, invece di essere disturbato empty()potresti usare:

hasSize(greaterThan(0))
( import static org.hamcrest.number.OrderingComparison.greaterThan;o
import static org.hamcrest.Matchers.greaterThan;)

Esempio:

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

La cosa più importante delle soluzioni di cui sopra è che non genera alcun avviso. La seconda soluzione è ancora più utile se si desidera stimare la dimensione minima del risultato.


1
@rogerdpack Ecco qua. Ho aggiunto l'esempio di stile 1.3. :)
rafalmag,

1
Attenzione che assertThat(list, not(hasSize(0)))avrà successo se lo listè null, al contrario diassertThat(list, hasSize(greaterThan(0)))
José Andias,

5

Se cerchi messaggi di errore leggibili, puoi fare a meno di hamcrest usando i soliti assertEquals con un elenco vuoto:

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

Ad esempio se corri

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

hai capito

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

2
È davvero bello vedere cosa è rimasto nell'elenco presumibilmente vuoto!
HDave

0

Crea il tuo IsEmpty TypeSafeMatcher personalizzato:

Anche se i problemi generici sono risolti nella 1.3cosa grandiosa di questo metodo è che funziona su qualsiasi classe che ha un isEmpty()metodo! Non solo Collections!

Ad esempio funzionerà anche su 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

Questo funziona:

assertThat(list,IsEmptyCollection.empty())
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.