是否有使用标准Hamcrest匹配器的更短版本的assert语句?
Collection<Element> collection = ...
assertThat(collection, is(anyOf(nullValue(Collection.class),
emptyCollectionOf(Element.class))));
我知道可以创建自定义匹配器,但希望能有现成的解决方案,而不需要进行任何额外的代码更改。
没有现成的解决方案,更糟糕的是,either()
由于此缺陷无法使用。因此,最简单的方式是:
assertThat(collection, anyOf(nullValue(), empty()));
实现这个的一种方法是创建一个自定义的Hamcrest匹配器,它结合了已经可用的匹配(例如IsNull.nullValue()
和IsEmptyCollection.empty()
)。
但一般来说,一个断言应该只断言一件事情。 我的意见是,在连续使用两个匹配器时,这并不会带来太大的痛苦,并且后期更易读。
此外,还有另一种首选模式——在返回集合时,优先返回空集合而不是null。其想法是避免不必要的null检查。
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());
if (collection != null && !collection.isEmpty()) {
fail(collection.toString());
}
null
而是返回空集合,则有一个更短的版本。 - M. Prokhorov