10

我有一个整数列表(当前),我想检查此列表是否包含预期列表中的所有元素,甚至不包含列表 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

4

1 回答 1

11

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...))));

请注意,这些匹配器不是来自CoreMatchersin hamcrest-core,因此您需要添加对hamcrest-library.

<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-library</artifactId>
    <version>1.3</version>
</dependency>
于 2013-02-18T09:52:43.953 回答