web-dev-qa-db-fra.com

Vérifier qu'une liste n'est pas vide dans Hamcrest

Je me demandais si quelqu'un connaissait un moyen de vérifier si une liste est vide en utilisant assertThat() et Matchers?

La meilleure façon de voir que je viens d'utiliser JUnit:

assertFalse(list.isEmpty());

Mais j'espérais qu'il y avait un moyen de faire cela à Hamcrest.

138
Ian Dallas

Bien il y a toujours

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

... mais je suppose que ce n'est pas tout à fait ce que vous vouliez dire :)

Alternativement:

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

empty() est une statique dans la classe Matchers. Notez la nécessité de convertir le list en Collection, grâce aux génériques géniaux de Hamcrest 1.2.

Les importations suivantes peuvent être utilisées avec hamcrest 1.3

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

Ceci est corrigé dans Hamcrest 1.3. Le code ci-dessous est compilé et ne génère aucun avertissement:

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

Mais si vous devez utiliser une version plus ancienne - au lieu de bogue empty(), vous pouvez utiliser:

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

Exemple:

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

La chose la plus importante à propos des solutions ci-dessus est qu’elle ne génère aucun avertissement. La deuxième solution est encore plus utile si vous souhaitez estimer la taille minimale du résultat.

75
rafalmag

Si vous recherchez des messages d'échec lisibles, vous pouvez vous passer de hamcrest en utilisant l'assertEquals habituel avec une liste vide:

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

Par exemple. si tu cours

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

vous obtenez

Java.lang.AssertionError
Expected :[]
Actual   :[foo, bar]
5
kamczak

Créez votre propre IsEmpty TypeSafeMatcher:

Même si les problèmes de génériques sont résolus dans 1.3, Le gros avantage de cette méthode est qu'elle fonctionne dans toutes les classes disposant d'une méthode isEmpty()! Pas seulement Collections!

Par exemple, cela fonctionnera également sur 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
user177800