JUnit 5 断言有助于验证测试的预期输出与实际输出是否一致。为简化说明,所有 JUnit Jupiter 断言都是 org.junit.jupiter.Assertions 类中的静态方法。

失败的断言将抛出 AssertionFailedError 或其子类。

1.对象相等断言 – assertEquals() 和 assertNotEquals()

使用 Assertions.assertEquals() 来断言预期值和实际值是否相等。assertEquals() 具有许多针对不同数据类型的重载方法,例如 int、short、float、char 等。它还支持传递错误消息,以便在测试失败时打印。

// 重载方法 public static void assertEquals(int expected, int actual) public static void assertEquals(int expected, int actual, String message) public static void assertEquals(int expected, int actual, Supplier<String< messageSupplier) 
// 示例 void test() { //测试通过 Assertions.assertEquals(4, Calculator.add(2, 2)); //测试失败 Assertions.assertEquals(3, Calculator.add(2, 2), "Calculator.add(2, 2) test failed"); //测试失败 Supplier<String> messageSupplier = () -> "Calculator.add(2, 2) test failed"; Assertions.assertEquals(3, Calculator.add(2, 2), messageSupplier); } 

类似地,Assertions.assertNotEquals() 方法用于断言预期值和实际值是否不相等。与 assertEquals() 不同,assertNotEquals() 不包含针对不同数据类型的重载方法,只接受 Object。

// 重载方法 public static void assertNotEquals(Object expected, Object actual) public static void assertNotEquals(Object expected, Object actual, String message) public static void assertNotEquals(Object expected, Object actual, Supplier<String> messageSupplier) 
// 示例 void test() { //测试通过 Assertions.assertNotEquals(3, Calculator.add(2, 2)); //测试失败 Assertions.assertNotEquals(4, Calculator.add(2, 2), "Calculator.add(2, 2) test failed"); //测试失败 Supplier<String> messageSupplier = () -> "Calculator.add(2, 2) test failed"; Assertions.assertNotEquals(4, Calculator.add(2, 2), messageSupplier); } 

2.数组相等断言 – assertArrayEquals()

assertArrayEquals() 方法断言预期和实际数组是否相等。

它还具有针对不同数据类型的重载方法,例如 boolean[]、char[]、int[] 等。它还支持传递错误消息,以便在测试失败时打印。

// 重载方法 public static void assertArrayEquals(int[] expected, int[] actual) public static void assertArrayEquals(int[] expected, int[] actual, String message) public static void assertArrayEquals(int[] expected, int[] actual, Supplier<String> messageSupplier) 
//示例 void testCase() { //测试通过 Assertions.assertArrayEquals(new int[]{1,2,3}, new int[]{1,2,3}, "Array Equal Test"); //因为顺序不同测试失败 Assertions.assertArrayEquals(new int[]{1,2,3}, new int[]{1,3,2}, "Array Equal Test"); //因为元素数量不同测试失败 Assertions.assertArrayEquals(new int[]{1,2,3}, new int[]{1,2,3,4}, "Array Equal Test"); } 

3. 可迭代对象相等断言 – assertIterableEquals()

assertIterableEquals() 断言预期和实际可迭代对象是否深度相等。深度相等意味着集合中的元素数量和顺序必须相同,并且迭代的元素也必须相等。

它还有三个重载方法。

// 重载方法 public static void assertIterableEquals(Iterable<?> expected, Iterable> actual) public static void assertIterableEquals(Iterable<?> expected, Iterable> actual, String message) public static void assertIterableEquals(Iterable<?> expected, Iterable> actual, Supplier<String> messageSupplier) 
// 示例 @Test void testCase() { Iterable<Integer> listOne = new ArrayList<>(Arrays.asList(1,2,3,4)); Iterable<Integer> listTwo = new ArrayList<>(Arrays.asList(1,2,3,4)); Iterable<Integer> listThree = new ArrayList<>(Arrays.asList(1,2,3)); Iterable<Integer> listFour = new ArrayList<>(Arrays.asList(1,2,4,3)); //测试通过 Assertions.assertIterableEquals(listOne, listTwo); //测试失败 Assertions.assertIterableEquals(listOne, listThree); //测试失败 Assertions.assertIterableEquals(listOne, listFour); } 

4.断言字符串行 – assertLinesMatch()

它断言预期的字符串列表与实际的字符串列表相匹配。字符串与另一个字符串匹配的逻辑是:

  • 1)检查 expected.equals(actual) 是否为真 – 如果是,继续下一对
  • 2)否则,将 expected 作为正则表达式,并通过 String.matches(String) 检查是否为真 – 如果是,继续下一对
  • 3)否则,检查预期行是否是快进标记,如果是,相应地应用快进实际行,并转到步骤1。

有效的快进标记是一个以>>开头并以>>结尾且包含至少四个字符的字符串。快进文字之间的任何字符都将被丢弃。

>>>> >> stacktrace >> >> single line, non Integer.parse()-able comment >> 

5.断言空值 – assertNotNull() 和 assertNull()

assertNotNull() 断言 actual 不为 null。同样,isNull() 方法断言 actual 为 null。两者都有三个重载方法。

// 重载方法 public static void assertNotNull(Object actual) public static void assertNotNull(Object actual, String message) public static void assertNotNull(Object actual, Supplier<String> messageSupplier) public static void assertEquals(Object actual) public static void assertEquals(Object actual, String message) public static void assertEquals(Object actual, Supplier<String> messageSupplier) 
// 示例 @Test void testCase() { String nullString = null; String notNullString = "howtodoinjava.com"; //测试通过 Assertions.assertNotNull(notNullString); //测试失败 Assertions.assertNotNull(nullString); //测试通过 Assertions.assertNull(nullString); // 测试失败 Assertions.assertNull(notNullString); } 

6.断言对象引用 – assertNotSame() 和 assertSame()

assertNotSame() 断言 expected 和 actual 不引用相同的对象。同样,assertSame() 方法断言 expected 和 actual 引用完全相同的对象。

两者都有三个重载方法。

//重载方法 public static void assertNotSame(Object expected, Object actual) public static void assertNotSame(Object expected, Object actual, String message) public static void assertNotSame(Object expected, Object actual, Supplier<> messageSupplier) public static void assertSame(Object expected, Object actual) public static void assertSame(Object expected, Object actual, String message) public static void assertSame(Object expected, Object actual, Supplier<String> messageSupplier) 
// 示例 @Test void testCase() { String originalObject = "howtodoinjava.com"; String cloneObject = originalObject; String otherObject = "example.com"; //测试通过 Assertions.assertNotSame(originalObject, otherObject); //测试失败 Assertions.assertNotSame(originalObject, cloneObject); //测试通过 Assertions.assertSame(originalObject, cloneObject); // 测试失败 Assertions.assertSame(originalObject, otherObject); } 

7.断言超时 – assertTimeout() 和 assertTimeoutPreemptively()

assertTimeout() 和 assertTimeoutPreemptively() 方法用于测试长时间运行的任务。如果测试中给定的任务超过指定的持续时间,测试将失败。

两种方法之间的唯一区别在于,在 assertTimeoutPreemptively() 中,如果超时超过,将预先中止 Executable 或 ThrowingSupplier 的执行。而在 assertTimeout() 中,Executable 或 ThrowingSupplier 将不会被中止。

// 重载方法 public static void assertTimeout(Duration timeout, Executable executable) public static void assertTimeout(Duration timeout, Executable executable, String message) public static void assertTimeout(Duration timeout, Executable executable, Supplier<String> messageSupplier) public static void assertTimeout(Duration timeout, ThrowingSupplier<T> supplier, String message) public static void assertTimeout(Duration timeout, ThrowingSupplier<T> supplier, Supplier<String> messageSupplier) 
//示例 @Test void testCase() { //测试通过 Assertions.assertTimeout(Duration.ofMinutes(1), () -> { return "result"; }); //测试失败 Assertions.assertTimeout(Duration.ofMillis(100), () -> { Thread.sleep(200); return "result"; }); //测试失败 Assertions.assertTimeoutPreemptively(Duration.ofMillis(100), () -> { Thread.sleep(200); return "result"; }); } 

8.断言布尔值 – assertTrue() 和 assertFalse()

assertTrue() 断言提供的条件为真或通过 BooleanSupplier 提供的布尔条件为真。

类似地,assertFalse() 断言提供的条件为假。

两者都具有以下重载方法:

// 重载方法 public static void assertTrue(boolean condition) public static void assertTrue(boolean condition, String message) public static void assertTrue(boolean condition, Supplier<String> messageSupplier) public static void assertTrue(BooleanSupplier booleanSupplier) public static void assertTrue(BooleanSupplier booleanSupplier, String message) public static void assertTrue(BooleanSupplier booleanSupplier, Supplier<String> messageSupplier) public static void assertFalse(boolean condition) public static void assertFalse(boolean condition, String message) public static void assertFalse(boolean condition, Supplier<String> messageSupplier) public static void assertFalse(BooleanSupplier booleanSupplier) public static void assertFalse(BooleanSupplier booleanSupplier, String message) public static void assertFalse(BooleanSupplier booleanSupplier, Supplier<String> messageSupplier) 
// 示例 @Test void testCase() { boolean trueBool = true; boolean falseBool = false; Assertions.assertTrue(trueBool); Assertions.assertTrue(falseBool, "test execution message"); Assertions.assertTrue(falseBool, AppTest::message); Assertions.assertTrue(AppTest::getResult, AppTest::message); Assertions.assertFalse(falseBool); Assertions.assertFalse(trueBool, "test execution message"); Assertions.assertFalse(trueBool, AppTest::message); Assertions.assertFalse(AppTest::getResult, AppTest::message); } private static String message () { return "Test execution result"; } private static boolean getResult () { return true; } 

9.断言错误 – assertThrows()

assertThrows() 断言执行提供的 Executable 时会抛出预期类型的异常,并返回该异常。

public static <T extends Throwable> T assertThrows(Class<T> expectedType, Executable executable) 
//示例 @Test void testCase() { Throwable exception = Assertions.assertThrows(IllegalArgumentException.class, () -> { throw new IllegalArgumentException("error message"); }); } 

10.断言测试失败 – fail()

fail() 方法会使测试失败。它有以下重载方法:

//重载方法 public static void fail(String message) public static void fail(Throwable cause) public static void fail(String message, Throwable cause) public static void fail(Supplier<String> messageSupplier) 
//示例 public class AppTest { @Test void testCase() { Assertions.fail("not found good reason to pass"); Assertions.fail(AppTest::message); } private static String message () { return "not found good reason to pass"; } }