你好啊,我是大陽。
本文我們將討論JUnit5的斷言功能。
JUnit 5 斷言是使用測試的實(shí)際結(jié)果驗證預(yù)期結(jié)果。所有JUnit Jupiter 斷言都是org.junit.jupiter.Assertions類中的靜態(tài)方法,方便使用。
有異常的斷言將拋出一個AssertionFailedError或它的一個子類。
1 assertEquals() 和 assertNotEquals()
Assertions.assertEquals()用于斷言期望值和實(shí)際值相等。Assertions.assertEquals()有許多針對不同數(shù)據(jù)類型的重載方法,例如 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)
示例:
package cn.dayangshuo.junit5.tests;
import cn.dayangshuo.junit5.Calculator;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.util.function.Supplier;
/**
* @author DAYANG
*/
public class CalculatorTests {
@Test
@DisplayName("a + b = c")
void addsTwoNumbers() {
//測試通過
Assertions.assertEquals(4, Calculator.add(2, 2));
//測試失敗
Assertions.assertEquals(3, Calculator.add(2, 2), "Calculator.add(2, 2) 測試失敗");
//測試失敗
Supplier<String> messageSupplier = () -> "Calculator.add(2, 2) 測試失敗";
Assertions.assertEquals(3, Calculator.add(2, 2), messageSupplier);
}
}
相反,Assertions.assertNotEquals()方法用于斷言期望值和實(shí)際值不相等。與assertEquals()相比,assertNotEquals()不包含針對不同數(shù)據(jù)類型的重載方法,僅接受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)
示例:
@Test
@DisplayName("a + b = c")
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() 方法斷言預(yù)期數(shù)組和實(shí)際數(shù)組相等。
它還具有針對不同數(shù)據(jù)類型的重載方法,例如 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)
3 assertIterableEquals()
它斷言預(yù)期的和實(shí)際的可迭代對象是完全相等的。完全相等意味著集合中元素的數(shù)量和順序必須相同,迭代的元素必須相等。
它還具有三個重載方法。
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)
4 assertLinesMatch()
它斷言預(yù)期的字符串列表與實(shí)際列表匹配。
5 assertNotNull() 和 assertNull()
assertNotNull() 斷言實(shí)際不為空。相反,assertNull()方法斷言實(shí)際是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)
6 assertNotSame() 和 assertSame()
assertNotSame()斷言預(yù)期和實(shí)際的不引用同一個對象。 assertSame() 方法斷言預(yù)期和實(shí)際引用完全相同的對象。兩者都有三個重載方法:
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)
7 assertTimeout()
它們是用于測試長時間運(yùn)行的任務(wù),如果測試任務(wù)花費(fèi)的時間超過指定的持續(xù)時間,則測試將失敗。
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() and assertFalse()
assertTrue()斷言提供的條件為真。相反,assertFalse()斷言提供的條件為false**。
兩者都有以下重載方法:
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)
9 assertThrows()
assetThrows()斷言提供的Executable執(zhí)行會引發(fā)expectedType異常并返回異常
//重載方法
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";
}
}