Проверка того, что список не пуст в Hamcrest

126

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

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

assertFalse(list.isEmpty());

Но я надеялся, что в Hamcrest есть способ сделать это.

  • 2
    Чтобы найти лучшее решение, проголосуйте за: code.google.com/p/hamcrest/issues/detail?id=97.
  • 2
    Проблема @FabricioLemos # 97, похоже, решена и добавлена в основную ветку git. Будем надеяться, что это скоро будет в следующем выпуске Hamcrest.
Показать ещё 1 комментарий
Теги:
hamcrest
junit
collections

4 ответа

134
Лучший ответ

Хорошо, всегда

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

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

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

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

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

Следующие импорта могут использоваться с hamcrest 1.3

import static org.hamcrest.Matchers.empty;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsNot.*;
  • 6
    Я считаю, что код Hamcrest выглядит намного лучше, если вы измените подсветку синтаксиса, чтобы сделать скобки невидимыми ...
  • 0
    Ваш второй assertThat () выдает мне следующую ошибку: Метод assertThat (T, Matcher <T>) в типе Assert не применим для аргументов (List <Integer>, Matcher <Collection <Object >>)
Показать ещё 10 комментариев
71

Это зафиксировано в 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)));

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

  • 0
    Это действительно трудно читать.
  • 1
    @palacsint Я надеюсь, что мой второй пример легче читать.
Показать ещё 2 комментария
5

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

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

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

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

вы получаете

java.lang.AssertionError
Expected :[]
Actual   :[foo, bar]
  • 1
    Очень приятно видеть, что осталось в якобы пустом списке!
1

Создайте свой собственный 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"); }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню