154

assertThat()とを使用してリストが空かどうかを確認する方法を誰かが知っているかどうか疑問に思いましたかMatchers

JUnitを使用するだけで確認できる最善の方法は次のとおりです。

assertFalse(list.isEmpty());

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

4

5 に答える 5

182

まあ常にあります

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

...しかし、それはあなたが意図したことではないと思います:)

または:

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

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

次のインポートは、hamcrest1.3で使用できます。

import static org.hamcrest.Matchers.empty;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsNot.*;
于 2010-09-02T20:47:26.397 に答える
82

これはHamcrest1.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番目のソリューションがさらに役立ちます。

于 2012-01-17T12:02:53.830 に答える
5

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

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

たとえば、実行する場合

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

あなたが得る

java.lang.AssertionError
Expected :[]
Actual   :[foo, bar]
于 2013-11-23T02:26:55.793 に答える
0

独自のカスタムIsEmptyTypeSafeMatcherを作成します。

ジェネリックの問題が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"); }
}
于 2015-09-14T20:15:53.793 に答える
0

これは機能します:

assertThat(list,IsEmptyCollection.empty())
于 2020-04-17T18:54:50.420 に答える