使用Hamcrest检查集合中是否包含某些元素

时间:2019-07-12 17:14:56

标签: java hamcrest

我正在尝试测试代码,我希望一个集合具有三个特定值中的两个。有没有简洁的方法可以使用Hamcrest 1.3进行测试?

我想要这样的东西:

Collection<String> set = new HashSet<>();
set.add("A");
set.add("B");
set.add("C");
// Remove an indeterminate element
set.iterator().next().remove();

// What the matcher actually is is the question
assertThat(set, hasSomeOf("A", "B", "C")); 
assertThat(set, hasSize(2));

只要set包含三个值中的两个,代码就可以正常工作,而在实际示例中,缺少哪个值实际上取决于String哈希码。

我认为这可能是处理它的最佳方法:

Collection<String> expected = Arrays.asList("A", "B", "C");
for (String value: set) {
  assertThat(value, isIn(expected));
  expected.remove(value);
}

这也有一个缺点,就是我不能使用其他匹配器,这在我的真实情况下是非常理想的。 (要重用我的虚拟匹配器,我想做类似hasSome(startsWith("A"), startsWith("B"), startsWith("C"))

的操作

澄清

如果set的{​​{1}}参数中没有包含某些内容,则匹配器将失败。

1 个答案:

答案 0 :(得分:0)

我相信您要寻找的匹配者是everyItem()oneOf()anyOf()组合。场景["C", "H"]对于hasSome("A", "B", "C")应该失败,可以这样写:

assertThat(set, everyItem(is(oneOf("A", "B", "C"))));

在添加项目H时会导致以下失败:

Expected: every item is is one of {"A", "B", "C"}
     but: an item was "H"

对于要包含多个匹配器的其他情况,只需替换期望即可。

assertThat(set, everyItem(is(anyOf(startsWith("A"), startsWith("B"), startsWith("C")))));

这将导致:

Expected: every item is is (a string starting with "A" or a string starting with "B" or a string starting with "C")
     but: an item was "H"