1. 概述

在 Java 单元测试中(尤其是使用 JUnit 框架时),我们经常需要验证某个 Collection 是否包含特定元素。作为强大的断言库,Hamcrest 通过 Matcher 提供了简洁且富有表现力的检查方式。

本文将探讨如何使用 Hamcrest 的 Matcher 检查集合是否包含特定元素。由于数组也是常用数据结构,我们也会讨论如何对数组执行相同检查。

2. 设置 Hamcrest

开始示例前,需确保项目已引入 Hamcrest。若使用 Maven,在 pom.xml 添加以下依赖:

<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest</artifactId>
    <version>2.2</version>
    <scope>test</scope>
</dependency>

可在 Maven Central 查询最新版本。

准备测试数据:

static final List<String> LIST = List.of("a", "b", "c", "d", "e", "f");
static final String[] ARRAY = { "a", "b", "c", "d", "e", "f" };

接下来验证它们是否包含特定元素。

3. 使用 Hamcrest 的 Matcher 和 assertThat()

Hamcrest 提供了丰富的 Matcher 操作集合。检查集合是否包含元素时,可使用 org.hamcrest.Matchers 类的 hasItem() 方法。

首先静态导入 hasItem() 方法提升可读性:

import static org.hamcrest.Matchers.hasItem;

然后验证集合是否包含/不包含元素:

assertThat(LIST, hasItem("a"));
assertThat(LIST, not(hasItem("x")));

✅ 上述代码使用 not() 方法对匹配逻辑取反。

hasItem() 方法简单直接,但无法用于数组检查。检查数组时需使用同类的 hasItemInArray() 方法:

assertThat(ARRAY, hasItemInArray("a"));
assertThat(ARRAY, not(hasItemInArray("x")));

通过 Hamcrest 的 hasItem()hasItemInArray() 可轻松解决元素存在性检查问题。

4. 使用 JUnit 的 assertTrue() 和 assertFalse()

Hamcrest Matcher 虽然便捷,也可用 JUnit 的 assertTrue()assertFalse() 实现相同目标:

assertTrue(LIST.contains("a"));
assertFalse(LIST.contains("x"));

⚠️ 此处 直接调用 Collectioncontains() 方法 检查元素存在性。

但数组没有类似 Collection.contains() 的便捷方法。好在 Java 提供了多种检查数组是否包含值的方式:

assertTrue(Arrays.stream(ARRAY).anyMatch("a"::equals));
assertFalse(Arrays.asList(ARRAY).contains("z"));

✅ 可将数组转为 List 或使用 Stream API 检查元素存在性。

对比分析:

  • 集合检查:Hamcrest 和 JUnit + contains() 都简洁直观
  • 数组检查:Hamcrest 的 hasItemInArray() 更紧凑易读,是更优选择

5. 总结

本文探讨了使用 JUnit 和 Hamcrest 检查集合/数组是否包含特定元素的多种方式:

推荐方案:

  • 集合检查:assertThat(collection, hasItem("element"))
  • 数组检查:assertThat(array, hasItemInArray("element"))

Hamcrest Matcher 能显著提升测试代码的可读性和表现力。虽然也可用 Java 标准API(如 Collection.contains() 或 Stream)配合 JUnit 断言实现,但在数组场景下 Hamcrest 的优势更明显。

完整示例代码见 GitHub 仓库


原始标题:Check Whether a Collection Contains an Element or Not Using Hamcrest | Baeldung