我正在尝试测试代码,我希望一个集合具有三个特定值中的两个。有没有简洁的方法可以使用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}}参数中没有包含某些内容,则匹配器将失败。
答案 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"