在Hamcrest中检查列表是否为空

时间:2010-09-02 20:44:38

标签: java collections junit hamcrest

我想知道是否有人知道如何使用assertThat()Matchers检查列表是否为空?

我能看到的最佳方式是使用JUnit:

assertFalse(list.isEmpty());

但是我希望在Hamcrest有一些方法可以做到这一点。

5 个答案:

答案 0 :(得分:147)

好吧总是

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

......但我猜这不是你的意思:)。

可替换地:

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

empty()Matchers类中的静态内容。请注意,需要将list转换为Collection,这要归功于Hamcrest 1.2的简单泛型。

以下导入可与hamcrest 1.3

一起使用
import static org.hamcrest.Matchers.empty;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsNot.*;

答案 1 :(得分:73)

这在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 :(得分:5)

如果您在读取失败消息之后,可以使用通常的assertEquals和空列表来执行hamcrest:

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

E.g。如果你跑

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

你得到了

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

答案 3 :(得分:1)

创建您自己的自定义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"); }
}

答案 4 :(得分:0)

这有效:

assertThat(list,IsEmptyCollection.empty())