mat*_*ckx 9 java junit hamcrest
我有一个整数列表(当前),我想检查此列表是否包含预期列表中的所有元素,甚至列表中的一个元素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()]))));
Run Code Online (Sandbox Code Playgroud)
好久不过.但是当我补充说
current.add(3);
Run Code Online (Sandbox Code Playgroud)
测试也是绿色的.我滥用了hamcrest匹配器吗?顺便说一句.
for (Integer i : notExpected)
assertThat(current, not(hasItem(i)));
Run Code Online (Sandbox Code Playgroud)
给了我正确的答案,但我认为我可以很容易地使用hamcrest匹配器.我正在使用junit 4.11和hamcrest 1.3
zag*_*gyi 10
hasItems(notExpected...)只会匹配current,如果从所有元素notExpected中也current.所以随着线
assertThat(current, not(hasItems(notExpected...)));
Run Code Online (Sandbox Code Playgroud)
你断言current不包含的所有元素的notExpected.
一个解决方案是断言,current不包含任何元素来自notExpected:
assertThat(current, everyItem(not(isIn(notExpected))));
Run Code Online (Sandbox Code Playgroud)
然后你甚至不必将列表转换为数组.此变体可能更具可读性,但需要转换为数组:
assertThat(current, everyItem(not(isOneOf(notExpected...))));
Run Code Online (Sandbox Code Playgroud)
请注意,这些匹配不是来自CoreMatchers于hamcrest-core,所以你将需要添加的依赖关系hamcrest-library.
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-library</artifactId>
<version>1.3</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)