在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"); } }