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

Mad*_*han 3 java hamcrest assertion

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

假设我有以下列表

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

List<String> actualList = Arrays.asList("a", "b", "c", "d");
Run Code Online (Sandbox Code Playgroud)

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

对于前。

a,d应该通过

a, b,c应该通过

但是ae应该会失败

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

assertThat(actualList,containsList(checkList))

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

sfi*_*iss 5

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

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));
Run Code Online (Sandbox Code Playgroud)

检查列表的顺序并不重要。

checkList如果你交换和的角色actualList,你也可以写:

assertThat(checkList, everyItem(isIn(actualList)));
Run Code Online (Sandbox Code Playgroud)

这可能比以下内容更具可读性:

assertTrue(actualList.stream().allMatch(checkList::contains));
Run Code Online (Sandbox Code Playgroud)