章
目
录
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";
}
}