Проверка того, что список не пуст в Hamcrest - PullRequest
137 голосов
/ 03 сентября 2010

Мне было интересно, знает ли кто-нибудь способ проверить, пуст ли Список, используя assertThat() и Matchers?

Лучший способ увидеть, просто использовать JUnit:

assertFalse(list.isEmpty());

Но я надеялся, что есть какой-то способ сделать это в Хэмкресте.

Ответы [ 4 ]

153 голосов
/ 03 сентября 2010

Ну, всегда есть

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

... но я думаю, это не совсем то, что вы имели в виду:)

В качестве альтернативы:

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

empty() является статическим в классе Matchers. Обратите внимание на необходимость приведения list к Collection, благодаря вонючему дженерику Hamcrest 1.2.

С помощью подколенного сухожилия можно использовать следующие операции импорта 1.3

import static org.hamcrest.Matchers.empty;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsNot.*;
74 голосов
/ 17 января 2012

Это исправлено в Hamcrest 1.3.Приведенный ниже код компилируется и не генерирует никаких предупреждений:

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

Но если вам нужно использовать более старую версию - вместо прослушивания empty() вы можете использовать:

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

Пример:

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

Самое важное в вышеуказанных решениях заключается в том, что они не генерируют никаких предупреждений.Второе решение еще более полезно, если вы хотите оценить минимальный размер результата.

5 голосов
/ 23 ноября 2013

Если вам нужны читаемые сообщения об ошибках, вы можете обойтись без hamcrest, используя обычные assertEquals с пустым списком:

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

например. если вы запустите

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

вы получите

java.lang.AssertionError
Expected :[]
Actual   :[foo, bar]
1 голос
/ 14 сентября 2015

Создайте свой собственный IsEmpty TypeSafeMatcher:

Даже если проблемы с дженериками исправлены в 1.3, замечательная особенность этого метода в том, что он работает с любым классом, у которого есть метод isEmpty()! Не только Collections!

Например, он будет работать и на 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"); }
}
...