web-dev-qa-db-ja.com

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

assertThat()Matchersを使用してリストが空かどうかを確認する方法を誰かが知っているのではないかと思っていました。

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

assertFalse(list.isEmpty());

しかし、私はこれをHamcrestで行う方法があることを望んでいました。

138
Ian Dallas

まあ常にあります

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

...しかし、私はそれがあなたが意味したものではないことを推測しています:)

代わりに:

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

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

次のインポートは、hamcrest 1.3で使用できます。

import static org.hamcrest.Matchers.empty;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsNot.*;
155
skaffman

これは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番目のソリューションは、結果の最小サイズを推定する場合にさらに役立ちます。

75
rafalmag

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

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

例えば。あなたが走ったら

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

あなたが得る

Java.lang.AssertionError
Expected :[]
Actual   :[foo, bar]
5
kamczak

独自のカスタム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"); }
}
0
user177800