Java Hamcrest Matcher 检查列表是否包含另一个列表

Java Hamcrest Matcher check if list contains another list

我想比较一个列表是否是另一个列表的子列表

假设我有以下列表

List<String> checkList = Arrays.asList("a", "d");

List<String> actualList = Arrays.asList("a", "b", "c", "d");

我想检查 actualList 是否包含 checkList 。我可以迭代每个值并进行比较。但是有没有任何 hamcrest 匹配器可以完成这项工作

例如。

a,d应该通过

a,b,c应该通过

但是a,e应该会失败

hasItems 支持单独传递字符串,contains 正在检查所有值,in 支持一个项目出现在列表中。但我想要

assertThat(actualList,containsList(checkList))

是否有可用的内置匹配器,或者我是否需要编写自定义匹配器?

hasItems 接受可变参数,因此您可以将列表转换为数组并传递它(或者,只需将其声明为数组开始):

final List<String> checkList = Arrays.asList("a", "d");
// final String[] checkListAsArray = new String[] { "a", "d" };
final String[] checkListAsArray = checkList.toArray(new String[checkList.size()]);
final List<String> actualList = Arrays.asList("a", "b", "c", "d");
assertThat(actualList, Matchers.hasItems(checkListAsArray));

清单的顺序并不重要。

如果你交换checkListactualList的角色,你还可以这样写:

assertThat(checkList, everyItem(isIn(actualList)));

这可能比:

更具可读性
assertTrue(actualList.stream().allMatch(checkList::contains));