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 ?

Le meilleur moyen pour moi de voir juste utiliser JUnit:

 assertFalse(list.isEmpty()); 

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

Bien il y a toujours

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

… mais je suppose que ce n’est pas tout à fait ce que tu voulais dire 🙂

Alternativement:

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

empty() est un statique dans la classe Matchers . Notez la nécessité de lancer la list dans 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.*; 

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

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

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

  • not(hasSize(0))
    ( import static org.hamcrest.collection.IsCollectionWithSize.hasSize; ou
    import static org.hamcrest.Matchers.hasSize; ).

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

Exemple:

 // given List list = new ArrayList(); // then assertThat(list, not(hasSize(0))); // or 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.

Si vous recherchez des messages d’échec lisibles, vous pouvez vous passer d’hamcrest en utilisant les assertEquals habituels avec une liste vide:

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

Par exemple, si vous courez

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

vous obtenez

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

Créez votre propre IsEmpty TypeSafeMatcher personnalisé:

Même si les problèmes génériques sont corrigés dans la version 1.3 la grande chose à propos de cette méthode est qu’elle fonctionne sur toutes les classes qui ont une méthode isEmpty() ! Pas seulement des Collections !

Par exemple, cela fonctionnera aussi sur Ssortingng !

 /* Matches any class that has an isEmpty() method * that returns a boolean */ public class IsEmpty extends TypeSafeMatcher { @Factory public static  Matcher empty() { return new IsEmpty(); } @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"); } } 

assertThat (collection, empty ());