标准Hamcrest匹配器检查集合是空还是空?

时间:2018-02-21 14:55:33

标签: java junit hamcrest

使用标准 Hamcrest匹配器是否有以下断言语句的较短版本?

Collection<Element> collection = ...

assertThat(collection, is(anyOf(nullValue(Collection.class), 
     emptyCollectionOf(Element.class))));

我意识到有一种方法可以创建一个自定义匹配器,希望可能已经存在一些解决这个问题的方法而不需要任何额外的代码更改。

4 个答案:

答案 0 :(得分:3)

没有开箱即用的解决方案,更糟糕的是,由于enter image description here错误导致无法使用either()。所以最短的方式就是:

assertThat(collection, anyOf(nullValue(), empty()));

答案 1 :(得分:2)

实现这一目标的一种方法是创建一个自定义的Hamcrest匹配器,它结合了已有的匹配项(如IsNull.nullValue()IsEmptyCollection.empty())。

但一般来说,一个断言应该只断言一件事。 我的观点是,连续两个匹配器并不是一个巨大的痛苦,以后它会更具可读性。

还有另一种首选模式 - 在返回集合时,更喜欢返回空集合而不是null。我们的想法是避免不必要的空值检查。

答案 2 :(得分:1)

我能想到的唯一方法是编写自己的Matcher

class EmptyOrNull extends BaseMatcher<Collection> {
    public boolean matches(Object o) {
        boolean result = o == null;
        if (o instanceof Collection) {
            result = ((Collection) o).isEmpty();
        }
        return result;
    }
    public String describeMismatch(Object item, Description description) {
        return "not null or empty!";
    }
    public static Matcher<Collection> emptyOrNull() { return new EmptyOrNull(); }
}

然后你可以使用更短的版本。

assertThat(collection, emptyOrNull());

答案 3 :(得分:0)

使用Assert.fail考虑​​一个简单的命令式解决方案。

if (collection != null && !collection.isEmpty()) {
    fail(collection.toString());
}