164 votes

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 à l'aide de la fonction assertThat() et Matchers ?

Le meilleur moyen que j'ai trouvé est d'utiliser JUnit :

assertFalse(list.isEmpty());

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

2 votes

Pour une meilleure solution, votez pour : code.google.com/p/hamcrest/issues/detail?id=97

2 votes

Le problème #97 de @FabricioLemos semble avoir été résolu et intégré à la branche git master. Espérons qu'il sera bientôt disponible dans la prochaine version de Hamcrest.

0 votes

@rafalmag Bon point. Ce sera bien de corriger toutes mes assertions pas très lisibles lorsque la v1.3 sera publiée.

194voto

skaffman Points 197885

Eh 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 un statique dans le Matchers classe. Notez qu'il est nécessaire d'intégrer l'élément list à Collection grâce aux génériques bancals 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.*;

6 votes

Je trouve que le code Hamcrest est beaucoup plus joli si vous modifiez votre coloration syntaxique pour rendre les parenthèses invisibles...

0 votes

Votre deuxième assertThat() me donne l'erreur suivante : La méthode assertThat(T, Matcher<T>) dans le type Assert n'est pas applicable pour les arguments (List<Integer>, Matcher<Collection<Object>>).

2 votes

@tkeE2036 : C'est les génériques cassés de Hamcrest qui travaillent. Parfois, il faut faire un cast pour que ça compile, par exemple. assertThat((Collection)list, is(not(empty())));

85voto

rafalmag Points 842

Ceci est corrigé dans Hamcrest 1.3. Le code ci-dessous compile 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 d'une version boguée empty() que vous pourriez 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)));

Le plus important dans les solutions ci-dessus est qu'elles ne génèrent aucun avertissement. La deuxième solution est encore plus utile si vous souhaitez estimer la taille minimale des résultats.

1 votes

@rogerdpack Voilà. J'ai ajouté l'exemple de style 1.3. :)

1 votes

Attention assertThat(list, not(hasSize(0))) sera succès de si list est null par opposition à assertThat(list, hasSize(greaterThan(0)))

8voto

kamczak Points 89

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

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

Par exemple, si vous exécutez

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

vous obtenez

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

2 votes

C'est vraiment agréable de voir ce qui restait dans la liste soi-disant vide !

0voto

Créez votre propre IsEmpty TypeSafeMatcher personnalisé :

Même si les problèmes de génériques sont corrigés dans 1.3 L'avantage de cette méthode, c'est qu'elle fonctionne avec n'importe quelle classe qui a un objet de type isEmpty() méthode ! Pas seulement Collections !

Par exemple, il fonctionnera sur String également !

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

0voto

Richard Points 191

Ça marche :

assertThat(list,IsEmptyCollection.empty())

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X