本文目录导读:

在Java开发中校验测试结果,核心在于断言(Assertion),断言就是把你期望的结果与程序实际运行的结果进行比较。
根据你使用的测试框架和测试类型(单元测试、集成测试等),有几种主流的方法:
使用 JUnit 断言(最常用的单元测试)
这是Java中最标准的校验方式,JUnit 5 提供了丰富的断言方法。
步骤:
- 添加JUnit依赖(Maven/Gradle)。
- 创建测试类,使用
@Test注解。 - 执行被测代码,获取实际结果。
- 使用
Assertions类的方法将实际结果与期望结果进行比较。
常用断言方法示例:
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*; // 静态导入,方便使用
public class CalculatorTest {
@Test
void testAddition() {
Calculator calculator = new Calculator();
// 1. 执行动作
int result = calculator.add(2, 3);
// 2. 使用断言校验结果
assertEquals(5, result); // 校验相等
assertTrue(result > 0); // 校验布尔条件
assertNotNull(result); // 校验非空
}
@Test
void testException() {
Calculator calculator = new Calculator();
// 3. 校验抛出预期的异常
assertThrows(IllegalArgumentException.class, () -> {
calculator.divide(1, 0);
});
}
@Test
void testWithMessage() {
// 4. 提供失败时的自定义消息
assertEquals(5, 2 + 3, "2 + 3 的结果应该为 5");
}
}
JUnit 5 核心断言表:
| 方法 | 用途 |
|---|---|
assertEquals(expected, actual) |
校验两个值是否相等(使用 .equals() 方法,对于对象需要重写 equals) |
assertNotEquals(unexpected, actual) |
校验两个值是否不相等 |
assertTrue(condition) |
校验条件为 true |
assertFalse(condition) |
校验条件为 false |
assertNull(object) |
校验对象为 null |
assertNotNull(object) |
校验对象不为 null |
assertThrows(exceptionType, executable) |
校验代码块是否抛出指定异常 |
assertAll(executables...) |
分组断言:多个断言一起执行,全部成功才算通过(避免有一个失败就停止) |
assertArrayEquals(expectedArray, actualArray) |
校验两个数组内容是否相等 |
使用 Hamcrest Matchers(更灵活的匹配)
Hamcrest 提供了一套更可读、灵活的匹配器,通常与 JUnit 结合使用。
特点: 错误信息非常清晰,匹配规则可组合。
import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
public class ListTest {
@Test
void testWithHamcrest() {
List<String> list = Arrays.asList("apple", "banana", "cherry");
// 校验集合
assertThat(list, hasSize(3)); // 校验大小
assertThat(list, hasItem("banana")); // 校验包含某个元素
assertThat(list, everyItem(containsString("a"))); // 校验每个元素都包含 "a"
// 校验字符串
String name = "Hello World";
assertThat(name, startsWith("Hello"));
assertThat(name, containsString("World"));
// 校验数字范围
int score = 85;
assertThat(score, is(greaterThan(80))); // 组合匹配器
assertThat(score, is(both(greaterThan(70)).and(lessThan(90))));
}
}
使用 AssertJ(现代、流畅的断言库)
AssertJ 是目前比较流行的选择,语法极其流畅,IDE 智能提示友好,错误消息也很有帮助。
特点: assertThat(actual) 返回一个专用于该类型的断言对象,可以一直 下去。
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
public class UserServiceTest {
@Test
void testWithAssertJ() {
User user = new User("Alice", 30, Arrays.asList("reading", "coding"));
// 流畅的链式断言
assertThat(user.getName())
.isEqualTo("Alice")
.startsWith("A")
.endsWith("ce");
assertThat(user.getAge())
.isGreaterThan(20)
.isLessThan(40);
assertThat(user.getHobbies())
.hasSize(2)
.contains("coding")
.doesNotContain("swimming");
// 校验异常
assertThatThrownBy(() -> { throw new RuntimeException("error"); })
.isInstanceOf(RuntimeException.class)
.hasMessageContaining("error");
}
}
集成测试中的特殊校验
当测试涉及数据库、HTTP接口、文件系统时,JUnit断言不足以直接使用,需要借助框架特性。
| 场景 | 校验方式 | 示例 |
|---|---|---|
| 数据库操作 | 使用 @DataJpaTest + TestEntityManager 或直接查询数据库 |
assertThat(entityManager.find(User.class, id)).isNotNull(); |
| REST API | 使用 MockMvc 或 WebTestClient 对HTTP响应进行断言 |
mockMvc.perform(get("/api/users/1")).andExpect(status().isOk()).andExpect(jsonPath("$.name").value("Alice")); |
| 文件I/O | 读取文件内容进行比较 | assertThat(Files.readString(Paths.get("output.txt"))).contains("expected content"); |
| 复杂对象 | 比较对象字段(需要重写 equals 和 hashCode,或使用匹配器) |
assertThat(actualUser).usingRecursiveComparison().isEqualTo(expectedUser); |
如何选择?
- 初学者 / 简单项目: 推荐使用 JUnit 5 原生断言(
assertEquals等),学习成本低,覆盖绝大多数场景。 - 追求可读性和灵活性: 推荐使用 AssertJ,链式调用非常符合人类阅读习惯,错误信息清晰。
- 需要复杂的集合/文本匹配: 可以引入 Hamcrest(AssertJ 已包含大部分 Hamcrest 的功能)。
- 测试数据库或接口: 必须结合 Spring Boot Test、MockMvc 等框架提供的测试工具。
核心思想始终是: 用代码表达“我期望这个结果是X”,让测试框架帮你判断“实际结果是否等于X”。