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]
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 aboolean
*/ public class IsEmptyextends 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 ());