我有一个整数列表(当前),我想检查此列表是否包含预期列表中的所有元素,甚至列表中的一个元素notExpected,因此代码如下所示:
List<Integer> expected= new ArrayList<Integer>();
expected.add(1);
expected.add(2);
List<Integer> notExpected = new ArrayList<Integer>();
notExpected.add(3);
notExpected.add(4);
List<Integer> current = new ArrayList<Integer>();
current.add(1);
current.add(2);
assertThat(current, not(hasItems(notExpected.toArray(new Integer[expected.size()]))));
assertThat(current, (hasItems(expected.toArray(new Integer[expected.size()]))));
这么好。但是当我添加
current.add(3);
测试也是绿色的。我滥用了hamcrest匹配器吗? 顺便说一句。
for (Integer i : notExpected)
assertThat(current, not(hasItem(i)));
给了我正确的答案,但我认为我可以很容易地使用hamcrest匹配器。我正在使用junit 4.11和hamcrest 1.3
答案 0 :(得分:10)
hasItems(notExpected...)
中的所有元素都在current
中, notExpected
只会与current
匹配。所以用线
assertThat(current, not(hasItems(notExpected...)));
您断言current
notExpected
不包含来自current
的所有元素。
断言notExpected
不包含来自assertThat(current, everyItem(not(isIn(notExpected))));
的任何元素的一种解决方案:
assertThat(current, everyItem(not(isOneOf(notExpected...))));
然后你甚至不必将列表转换为数组。此变体可能更具可读性,但需要转换为数组:
CoreMatchers
请注意,这些匹配器不是来自hamcrest-core
中的hamcrest-library
,因此您需要在<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-library</artifactId>
<version>1.3</version>
</dependency>
上添加依赖项。
{{1}}