断言参考
基础断言
import static org.junit.jupiter.api.Assertions.*;
@Test
void basicAssertions() {
assertEquals(4, 2 + 2);
assertEquals("hello", result.toLowerCase());
assertEquals(3.14, Math.PI, 0.01); // 浮点数 delta
assertNull(user.getMiddleName());
assertNotNull(response.getBody());
assertTrue(list.isEmpty());
assertFalse(user.isBanned());
assertArrayEquals(new int[]{1, 2, 3}, actual);
// 带失败消息
assertEquals(200, response.getStatus(), "期望 OK 状态");
}
assertThrows 与 assertDoesNotThrow
@Test
void exceptionAssertions() {
IllegalArgumentException ex = assertThrows(
IllegalArgumentException.class,
() -> service.create(null)
);
assertEquals("名称不能为空", ex.getMessage());
// 断言不抛出异常
assertDoesNotThrow(() -> service.healthCheck());
// assertThrowsExactly — 不接受子类
assertThrowsExactly(
NullPointerException.class,
() -> parseNull()
);
}
assertAll — 分组断言
@Test
void userFieldsAreCorrect() {
User user = service.findById(1L);
// 即使某条断言失败,所有断言都会执行
assertAll("用户属性",
() -> assertEquals("张三", user.getName()),
() -> assertEquals("zhangsan@example.com", user.getEmail()),
() -> assertTrue(user.isActive()),
() -> assertNotNull(user.getCreatedAt())
);
}
assertTimeout 与 assertTimeoutPreemptively
import java.time.Duration;
@Test
void operationCompletesInTime() {
String result = assertTimeout(Duration.ofSeconds(2), () -> {
return processBigFile();
});
assertNotNull(result);
}
@Test
void operationAbortedIfTooSlow() {
// 超时后中断执行(在新线程中运行)
assertTimeoutPreemptively(Duration.ofMillis(500), () -> {
Thread.sleep(200);
return fetchData();
});
}
假设条件 — assumeTrue / assumingThat
import static org.junit.jupiter.api.Assumptions.*;
@Test
void onlyRunOnLinux() {
assumeTrue("Linux".equals(System.getProperty("os.name")));
// 仅在 Linux 上运行,否则跳过(不是失败)
}
@Test
void conditionalBehavior() {
assumingThat(
Boolean.getBoolean("ci.build"),
() -> {
assertEquals(0, getWarnings().size());
}
);
// 以下代码始终执行
assertNotNull(mainResult);
}
AssertJ 自定义断言
import static org.assertj.core.api.Assertions.*;
@Test
void assertJExamples() {
assertThat("你好,世界")
.startsWith("你好")
.hasSize(5);
assertThat(list)
.hasSize(3)
.contains("苹果", "香蕉")
.doesNotContain("樱桃");
assertThatThrownBy(() -> service.divide(1, 0))
.isInstanceOf(ArithmeticException.class)
.hasMessage("/ by zero");
}