滥用hamcrest hasItems

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)

请注意,这些匹配不是来自CoreMatchershamcrest-core,所以你将需要添加的依赖关系hamcrest-library.

<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-library</artifactId>
    <version>1.3</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)