断言参考

基础断言

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("[email protected]", 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"); }