检查列表在Hamcrest中是否为空


147

我想知道是否有人知道一种使用assertThat()和检查列表是否为空的方法Matchers

我看到的最好方法就是使用JUnit:

assertFalse(list.isEmpty());

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


2
为了获得更好的解决方案,请投票:code.google.com/p/hamcrest/issues/detail?id=97
Fabricio Lemos 2010年

2
@FabricioLemos问题#97似乎已解决并合并到主git分支。希望很快会在下一个hamcrest版本中发布。
rafalmag

@rafalmag好地方。v1.3发布时,修复我所有不太可读的断言将是一件好事
andyb

Answers:


165

好吧,总有

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

...但是我想那不是你的意思:)

或者:

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

empty()Matchers该类中是静态的。请注意,必须将转换listCollection,这要归功于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.*;

6
我发现,如果您更改语法突出显示以使括号不可见,则Hamcrest代码看起来要好得多……
skaffman 2010年

2
@ tkeE2036:那是Hamcrest破碎的仿制药。有时您需要进行assertThat((Collection)list, is(not(empty())));
强制

7
这是固定在1.3
artbristol

14
@dzieciou,当测试失败时,它会为您提供更好的错误消息。因此,而不是expected true but got false得到类似的东西expected empty but got [1, 2, 3]
Brad Cupit 2012年

3
如果您不希望进行无限制的转换,并且愿意放弃静态导入,则可以将泛型添加到该方法中,例如:(assertThat(list, Matchers.<String>empty())假设列表是的集合String
earcam 2013年

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

上述解决方案最重要的事情是它不会生成任何警告。如果您想估计最小结果大小,则第二种解决方案甚至更有用。


1
@rogerdpack在这里,你去。我添加了1.3样式示例。:)
rafalmag

1
提防如果成功,那assertThat(list, not(hasSize(0)))将是成功listnull,而不是assertThat(list, hasSize(greaterThan(0)))
何塞·安迪亚斯(JoséAndias)

5

如果您在阅读易读的失败消息之后,可以通过使用带有空列表的常规assertEquals来进行处理:

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

例如,如果您跑步

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

你得到

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

2
很高兴看到所谓的空列表中还剩下什么!
HDave 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"); }
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.