【问题标题】:Standard Hamcrest matcher to check if collection is empty or null?标准 Hamcrest 匹配器来检查集合是空的还是空的?
【发布时间】:2018-02-21 14:55:33
【问题描述】:

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

Collection<Element> collection = ...

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

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

【问题讨论】:

  • 如果您的代码更改为从不返回 null 来代替空集合,则有一个较短的版本。

标签: java junit hamcrest


【解决方案1】:

没有开箱即用的解决方案,更糟糕的是,由于this 错误,either() 无法使用。所以最短的方法是这样的:

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

【讨论】:

    【解决方案2】:

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

    但一般来说,断言应该只为一件事断言。 我的观点是,连续拥有两个匹配器并不是一件很痛苦的事情,而且以后可读性更好。

    还有另一种首选模式 - 返回集合时,更喜欢返回空集合而不是 null。这样做是为了避免不必要的空检查。

    【讨论】:

    • 我原则上同意你的第二个说法。在实践中,虽然这种组合情况经常出现,所以有类似 emptyOrNull() 的东西会很好
    • 可能有很多不同的方法 - 你总是可以创建一个自定义匹配器(如其他答案中所建议的那样),或者只是将两个断言包装在一个实用方法“nullOrEmpty(testTarget)”中并调用它在所有需要的地方。归根结底——它只是测试用例——如果它测试了预期的功能——那就很好了。我真的看不出在一个断言中压缩这两行有什么好处。
    【解决方案3】:

    我能想到的唯一方法就是编写自己的 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());
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-24
        • 1970-01-01
        • 1970-01-01
        • 2016-06-20
        • 1970-01-01
        相关资源
        最近更新 更多