Перевірка, що список не порожній у Hamcrest


147

Мені було цікаво, чи хтось знає про спосіб перевірити, чи Список порожній за допомогою assertThat()і Matchers?

Найкращий спосіб я бачив просто використовувати JUnit:

assertFalse(list.isEmpty());

Але я сподівався, що є якийсь спосіб зробити це в Hamcrest.


2
Для кращого рішення проголосуйте за: code.google.com/p/hamcrest/isissue/detail?id=97
Fabricio Lemos

2
Випуск @FabricioLemos № 97, здається, вирішений і злитий для освоєння гіти Git. Будемо сподіватися, що це буде найближчим часом у наступному випуску hacrest.
rafalmag

@rafalmag Добре місце. Буде добре виправити всі мої нечитабельні твердження, коли випущено v1.3
andyb

Відповіді:


165

Ну, завжди є

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 виглядає набагато приємніше, якщо змінити підсвічування синтаксису, щоб зробити дужки невидимими ...
skaffman

2
@ tkeE2036: Ось зламані дженерики Hamcrest на роботі. Іноді вам потрібно зробити це, щоб скласти його, наприкладassertThat((Collection)list, is(not(empty())));
skaffman

7
Це зафіксовано в 1.3
artbristol

14
@dzieciou це дає вам краще повідомлення про помилку, коли тест не працює. Тож замість expected true but got falseвас вийде щось на кшталтexpected empty but got [1, 2, 3]
Брад Купіт

3
Якщо ви вважаєте за краще не неперевіреного перетворення, і готові відмовитися від статичного імпорту, то ви можете додати дженерики методу, як: assertThat(list, Matchers.<String>empty())(передбачається , що список є колекцією Stringс)
earcam

77

Це зафіксовано в 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)));

Найголовніше, що стосується вищезгаданих рішень, - це те, що вони не створюють жодних попереджень. Друге рішення ще корисніше, якщо ви хочете оцінити мінімальний розмір результату.


1
@rogerdpack Ось ви йдете. Я додав приклад стилю 1.3. :)
rafalmag

1
Остерігайтеся, що assertThat(list, not(hasSize(0)))це буде успішно, якщо він listє null, на відміну відassertThat(list, hasSize(greaterThan(0)))
Хосе Андіас

5

Якщо ви хочете прочитати повідомлення про помилку, ви можете обійтися без перешкод, скориставшись звичайними аргументами excert з порожнім списком:

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

Наприклад, якщо ти біжиш

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

Ви отримуєте

java.lang.AssertionError
Expected :[]
Actual   :[foo, bar]

2
Дійсно приємно бачити, що залишилось у нібито порожньому списку!
HDave

0

Створіть свій власний користувальницький 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"); }
}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.