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

标签 java assertion hamcrest

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

假设我有以下列表

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

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

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

例如。

a,d 应该通过

abc 应该通过

但是ae应该失败

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

assertThat(actualList,containsList(checkList))

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

最佳答案

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));

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

如果交换 checkListactualList 的角色,您还可以编写:

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

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

assertTrue(actualList.stream().allMatch(checkList::contains));

关于Java Hamcrest Matcher 检查列表是否包含另一个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58592066/

相关文章:

java - 枚举哈希码计算不一样

go - 将接口(interface)断言为其类型

java - 是否有可能在编译时像禁用 Java 1.4 的 assert 关键字一样禁用 guava 的先决条件?

java - 检查 Hamcrest 中的 List 是否为空

java - hamcrest containsInAnyOrder 仅适用于特定订单

java - StringBuffer 在线程安全程序的设计中到底是如何工作的?

java - 带有 Java 9 的 Netbeans 不创建/dis/lib

java - SQL中如何获取记录删除日期?

java - 断言(假)与 RuntimeException?

java - Hamcrest 匹配器的多个 hasProperty 约束