在Hamcrest中检查列表是否为空

我想知道是否有人知道使用assertThat()Matchers来检查List是否为空的方法?

我可以看到使用JUnit的最佳方式:

 assertFalse(list.isEmpty()); 

但我希望在Hamcrest有办法做到这一点。

那里总有

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

…但我猜这不完全是你的意思:)

或者:

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

empty()Matchers类中是静态的。 请注意,需要把list投给Collection ,这要归功于Hamcrest 1.2的不可思议的generics。

下面的import可以用于hamcrest 1.3

 import static org.hamcrest.Matchers.empty; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsNot.*; 

这在Hamcrest 1.3中是固定的。 下面的代码编译并不会产生任何警告:

 // given List<String> list = new ArrayList<String>(); // then assertThat(list, is(not(empty()))); 

但是,如果您必须使用旧版本 – 而不是bug empty()您可以使用:

  • not(hasSize(0))
    import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
    import static org.hamcrest.Matchers.hasSize; )。

  • 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, not(hasSize(0))); // or assertThat(list, hasSize(greaterThan(0))); 

上述解决scheme最重要的是它不会产生任何警告。 如果你想估计最小结果大小,第二个解决scheme更加有用。

如果你是可读的失败消息之后,你可以通过使用通常的assertEquals和一个空列表来做到这一点:

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

如果你跑步

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

你得到

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

创build您自己的自定义IsEmpty TypeSafeMatcher:

即使generics的问题在1.3得到解决,这个方法的isEmpty()在于它有一个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"); } }