在Hamcrest中检查列表是否为空

Ian*_*las 142 java collections junit hamcrest

我想知道是否有人知道如何使用assertThat()和检查列表是否为空Matchers

我只能使用JUnit的最佳方式:

assertFalse(list.isEmpty());
Run Code Online (Sandbox Code Playgroud)

但我希望在Hamcrest有一些方法可以做到这一点.

ska*_*man 161

好吧总有

assertThat(list.isEmpty(), is(false));
Run Code Online (Sandbox Code Playgroud)

......但我猜这不是你的意思:)

或者:

assertThat((Collection)list, is(not(empty())));
Run Code Online (Sandbox Code Playgroud)

empty()Matchers课堂上是静态的.请注意,由于Hamcrest 1.2的不稳定的泛型,需要投射listCollection.

以下导入可与hamcrest 1.3一起使用

import static org.hamcrest.Matchers.empty;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsNot.*;
Run Code Online (Sandbox Code Playgroud)

  • @dzieciou它会在测试失败时为您提供更好的错误消息.因此,不是"预期为真,而是为假",而是"预期为空但得到[1,2,3]" (12认同)
  • 这在1.3中得到修复 (7认同)
  • 我发现Hamcrest代码看起来更好,如果你改变你的语法高亮,使括号不可见... (6认同)
  • 如果你更喜欢没有选中的转换,并愿意放弃静态导入,那么你就可以仿制药添加到方法,如:(列表,匹配器<String>的空())`assertThat`(假设列表是一个集合`String`s) (3认同)
  • @ tkeE2036:那是Hamcrest在工作中破碎的泛型.有时你需要强制转换才能编译,例如`assertThat((Collection)list,is(not(empty()))); (2认同)
  • @Ian 这个答案已经过时了,现在应该接受更好的答案。 (2认同)

raf*_*mag 75

这在Hamcrest 1.3中得到修复.以下代码编译并不会生成任何警告:

// given
List<String> list = new ArrayList<String>();
// then
assertThat(list, is(not(empty())));
Run Code Online (Sandbox Code Playgroud)

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

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, hasSize(greaterThan(0)));
Run Code Online (Sandbox Code Playgroud)

上述解决方案最重要的是它不会产生任何警告.如果您想估计最小结果大小,第二种解决方案会更有用.


kam*_*zak 5

如果您在读取失败消息之后,可以使用通常的assertEquals和空列表来执行hamcrest:

assertEquals(new ArrayList<>(0), yourList);
Run Code Online (Sandbox Code Playgroud)

例如,如果你跑

assertEquals(new ArrayList<>(0), Arrays.asList("foo", "bar");
Run Code Online (Sandbox Code Playgroud)

你得到

java.lang.AssertionError
Expected :[]
Actual   :[foo, bar]
Run Code Online (Sandbox Code Playgroud)

  • 很高兴看到所谓的空列表中还剩下什么! (2认同)