JUnit 5 Assertions断言详解示例

后端 潘老师 7个月前 (10-24) 133 ℃ (0) 扫码查看

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";
    }
}

版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/10299.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】