Hamcrestでリストが空でないことを確認する


147

誰もがリストを使用して空であるかどうかを確認する方法を知っていた場合、私は思っていたassertThat()Matchers

私がJUnitを使用するのを見ることができる最良の方法:

assertFalse(list.isEmpty());

しかし、私はこれをハムクレストで行う方法があることを望んでいました。


2
より良い解決策については、投票してください:code.google.com/p/hamcrest/issues/detail?id
Fabricio Lemos

2
@FabricioLemos issue#97は解決され、マスターgitブランチにマージされたようです。それが次のhamcrestリリースですぐにあることを願いましょう。
rafalmag

@rafalmag良いスポット。v1.3がリリースされたときに、あまり読めないアサーションをすべて修正するとよいでしょう
andyb

回答:


165

ええと、常にあります

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

...しかし、それはあなたが意図したものとはまったく違うと思います:)

または:

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

empty()Matchersクラスの静的です。Hamcrest 1.2の奇抜なジェネリックのおかげで、listto をキャストする必要があることに注意してくださいCollection

次のインポートは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:それが、ハムクレストの壊れたジェネリックです。場合によっては、コンパイルするためにキャストする必要があります。例assertThat((Collection)list, is(not(empty())));
skaffman

7
これは1.3で修正されました
artbristol 2012

14
@dzieciouテストが失敗したときに、より良いエラーメッセージを表示します。したがって、代わりにexpected true but got false次のようなものを取得しますexpected empty but got [1, 2, 3]
ブラッドキューピット2012年

3
未チェックの変換をassertThat(list, Matchers.<String>empty())String
望ま

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)));

上記のソリューションで最も重要なことは、警告が生成されないことです。2番目のソリューションは、最小結果サイズを見積もる場合にさらに役立ちます。


1
@rogerdpackどうぞ。1.3スタイルの例を追加しました。:)
rafalmag

1
次の場合とは対照的に、成功assertThat(list, not(hasSize(0)))することに注意してくださいlistnullassertThat(list, hasSize(greaterThan(0)))
ホセアンディアス

5

読み取り可能な失敗メッセージの後である場合は、空のリストで通常のassertEqualsを使用することにより、hamcrestなしで実行できます。

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

例えばあなたが走るなら

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

あなたは得る

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

2
おそらく空のリストに残っているものを見るのは本当に素晴らしいです!
2014年

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"); }
}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.