web-dev-qa-db-ja.com

コレクションが空でもヌルでもないことを確認するためのハムクレストマッチャーはありますか?

引数が空のコレクションでもnullでもないことをチェックするHamcrestマッチャーはありますか?

いつでも使えると思います

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

しかし、もっと簡単な方法があるのだろうかと思っていたので、それを見逃しました。

17
jhyot

IsCollectionWithSizeOrderingComparison マッチャーを組み合わせることができます。

_@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")の場合、テストは合格です。

編集:

次のアプローチが機能していないことに気づきました:

_assertThat(collection, is(not(empty())));
_

Nullについて明示的にテストしたい場合は、考えれば考えるほど、OPによって記述されたステートメントのわずかに変更されたバージョンをお勧めします。

_assertThat(collection, both(not(empty())).and(notNullValue()));
_
11
eee

コメントに投稿したように、_collection != null_と_size != 0_の論理的等価物は_size > 0_であり、これはコレクションがnullではないことを意味します。 _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 
    }
}
_
2
mike

マッチャーを使用できます。

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.anyOf;

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