滥用hamcrest hasItems

时间:2013-02-18 08:45:29

标签: 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()]))));

这么好。但是当我添加

    current.add(3);

测试也是绿色的。我滥用了hamcrest匹配器吗? 顺便说一句。

    for (Integer i : notExpected)
        assertThat(current, not(hasItem(i)));

给了我正确的答案,但我认为我可以很容易地使用hamcrest匹配器。我正在使用junit 4.11和hamcrest 1.3

1 个答案:

答案 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}}