ti-enxame.com

Verificando se uma lista não está vazia no Hamcrest

Eu queria saber se alguém sabia de uma maneira de verificar se uma lista está vazia usando assertThat() e Matchers?

A melhor maneira que eu pude ver é apenas usar o JUnit:

assertFalse(list.isEmpty());

Mas eu estava esperando que houvesse alguma maneira de fazer isso em Hamcrest.

135
Ian Dallas

Bem, há sempre

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

... mas eu estou supondo que não é bem o que você quis dizer :)

Alternativamente:

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

empty() é uma estática na classe Matchers. Observe a necessidade de lançar o list para Collection, graças aos genéricos instáveis ​​do Hamcrest 1.2.

As seguintes importações podem ser usadas com o hamcrest 1.3

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

Isso é corrigido no Hamcrest 1.3. O código abaixo compila e não gera nenhum aviso:

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

Mas se você tem que usar uma versão mais antiga - em vez de bugado empty() você pode usar:

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

Exemplo:

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

O mais importante sobre as soluções acima é que ele não gera nenhum aviso. A segunda solução é ainda mais útil se você quiser estimar o tamanho mínimo do resultado.

73
rafalmag

Se você está atrás de mensagens de falha legíveis, você pode fazer sem hamcrest usando o usual assertEquals com uma lista vazia:

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

Por exemplo. se você correr

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

você pega

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

Crie seu próprio IsEmpty TypeSafeMatcher personalizado:

Mesmo que os problemas genéricos sejam corrigidos em 1.3, o melhor deste método é que funciona em qualquer classe que tenha um método isEmpty()! Não apenas Collections!

Por exemplo, ele também funcionará em 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"); }
}
1
user177800