Есть ли совпадение Hamcrest, чтобы проверить, что коллекция не является ни пустой, ни нулевой?

Есть ли счетчик Hamcrest, который проверяет, что аргумент не является ни пустой, ни пустой?

Думаю, я всегда мог использовать

both(notNullValue()).and(not(hasSize(0))

но мне было интересно, есть ли более простой способ, и я пропустил его.

Ответы

Ответ 1

Вы можете комбинировать IsCollectionWithSize и OrderingComparison:

@Test
public void test() throws Exception {
    Collection<String> collection = ...;
    assertThat(collection, hasSize(greaterThan(0)));
}
  • Для collection = null вы получаете

    java.lang.AssertionError: 
    Expected: a collection with size a value greater than <0>
        but: was null
    
  • Для collection = Collections.emptyList() вы получаете

    java.lang.AssertionError: 
    Expected: a collection with size a value greater than <0>
        but: collection size <0> was equal to <0>
    
  • Для collection = Collections.singletonList("Hello world") тест проходит.

Edit:

Только что заметил, что следующий запрос не работает:

assertThat(collection, is(not(empty())));

Чем больше я думаю об этом, тем больше я бы рекомендовал слегка измененную версию инструкции, написанной OP, если вы хотите явно проверить значение null.

assertThat(collection, both(not(empty())).and(notNullValue()));

Ответ 2

Как я писал в комментариях, логический эквивалент collection != null и size != 0 size > 0, что означает, что коллекция не является нулевой. Более простой способ выразить size > 0 равен there is an (arbitrary) element X in collection. Ниже примера рабочего кода.

import static org.hamcrest.core.IsCollectionContaining.hasItem;
import static org.hamcrest.CoreMatchers.anything;

public class Main {

    public static void main(String[] args) {
        boolean result = hasItem(anything()).matches(null);
        System.out.println(result); // false for null

        result = hasItem(anything()).matches(Arrays.asList());
        System.out.println(result); // false for empty

        result = hasItem(anything()).matches(Arrays.asList(1, 2));
        System.out.println(result); // true for (non-null and) non-empty 
    }
}

Ответ 3

Вы можете использовать Hamcrest:

import static org.hamcrest.MatcherAssert.assertThat;

assertThat(collection, anyOf(nullValue(), empty()));