1. 概述

本文将深入探讨 Hamcrest 文本匹配器的使用技巧。虽然我们之前在 Hamcrest 测试指南 中已经介绍过 Hamcrest 匹配器的基础知识,但这次我们将专门聚焦文本匹配器,帮你快速掌握字符串断言的精髓。

2. Maven 配置

首先在 pom.xml 中添加依赖:

<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>java-hamcrest</artifactId>
    <version>2.0.0.0</version>
    <scope>test</scope>
</dependency>

最新版 java-hamcrest 可在 Maven Central 获取。配置完成后,我们直接进入正题。

3. 文本相等匹配器

除了通用的 isEqual() 匹配器,Hamcrest 还为字符串提供了两个专用匹配器:

忽略大小写匹配

@Test
public void whenTwoStringsAreEqual_thenCorrect() {
    String first = "hello";
    String second = "Hello";

    assertThat(first, equalToIgnoringCase(second));
}

忽略首尾空格匹配

@Test
public void whenTwoStringsAreEqualWithWhiteSpace_thenCorrect() {
    String first = "hello";
    String second = "   Hello   ";

    assertThat(first, equalToIgnoringWhiteSpace(second));
}

⚠️ 注意:equalToIgnoringWhiteSpace() 只会处理首尾空格,中间空格仍会影响匹配结果。

4. 空文本匹配器

处理空字符串时,Hamcrest 提供了精准的匹配方案:

空白字符串匹配(仅含空格或 null)

@Test
public void whenStringIsBlank_thenCorrect() {
    String first = "  ";
    String second = null;
    
    assertThat(first, blankString());
    assertThat(first, blankOrNullString());
    assertThat(second, blankOrNullString());
}

空字符串匹配(长度为0或 null)

@Test
public void whenStringIsEmpty_thenCorrect() {
    String first = "";
    String second = null;

    assertThat(first, emptyString());
    assertThat(first, emptyOrNullString());
    assertThat(second, emptyOrNullString());
}

踩坑提醒:blankString()emptyString() 对 null 的处理方式不同,前者接受 null 后者拒绝。

5. 正则匹配器

需要验证字符串格式时,直接使用正则表达式:

@Test
public void whenStringMatchPattern_thenCorrect() {
    String first = "hello";

    assertThat(first, matchesPattern("[a-z]+"));
}

简单粗暴:matchesPattern() 内部使用 String.matches() 实现,确保正则表达式全匹配。

6. 子串匹配器

Hamcrest 提供了丰富的子串检测方案:

包含子串检测

@Test
public void whenVerifyStringContains_thenCorrect() {
    String first = "hello";

    assertThat(first, containsString("lo"));
    assertThat(first, containsStringIgnoringCase("EL"));
}

有序子串检测

@Test
public void whenVerifyStringContainsInOrder_thenCorrect() {
    String first = "hello";
    
    assertThat(first, stringContainsInOrder("e","l","o"));
}

前缀/后缀检测

@Test
public void whenVerifyStringStartsWith_thenCorrect() {
    String first = "hello";

    assertThat(first, startsWith("he"));
    assertThat(first, startsWithIgnoringCase("HEL"));
}

@Test
public void whenVerifyStringEndsWith_thenCorrect() {
    String first = "hello";

    assertThat(first, endsWith("lo"));
    assertThat(first, endsWithIgnoringCase("LO"));
}

实用技巧:stringContainsInOrder() 在验证复杂字符串结构时特别高效,比如检测日志中的关键字序列。

7. 总结

本文系统梳理了 Hamcrest 文本匹配器的核心用法,包括:

  • 文本相等匹配(大小写/空格处理)
  • 空值检测(空字符串 vs 空白字符串)
  • 正则表达式匹配
  • 子串检测(包含/有序/前后缀)

完整示例代码请查阅 GitHub 仓库。掌握这些匹配器,你的测试代码将更简洁、更易读!


原始标题:Hamcrest Text Matchers

« 上一篇: RxJava Maybe 详解