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.
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.*;
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;
Ouimport 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.
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]
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"); }
}