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 仓库。掌握这些匹配器,你的测试代码将更简洁、更易读!