Assertions

Nếu chúng ta muốn viết Assertion bằng cách sử dụng API JUnit 5, ta cần phải sử dụng class org.junit.jupiter.api.Assertions. Nó cung cấp các static method mà chúng ta có thể sử dụng để viết các assertion


assertEquals() và assertNotEquals()

assertEquals() dùng để xác minh giá trị mong đợi và giá trị thực tế bằng nhau. assertEquals() có nhiều method overloading cho các kiểu dữ liệu khác nhau như: int, float, short,…

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)

Cùng xem ví dụ sau:

public int sum(int a, int b){
    return a+b;
}
@Test
void assertEqualsExample() {
    //Test will pass
    assertEquals(calculator.sum(1, 1), 2);

    //Test will failed
    assertEquals(calculator.sum(2, 2), 5);
}

Tương tự, assertNotEquals() dùng để xác minh giá trị mong đợi và giá trị thực tế không bằng nhau. Khác với assertEquals(), assertNotEquals() không có method overloading, mà chỉ chấm nhận kiểu 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)

Vẫn với phương thức tính tổng hai số:

@Test
void assertNotEqualsExample(){
    //Test will failed
    assertNotEquals(calculator.sum(1,1),2);

    //Test will pass
    assertNotEquals(calculator.sum(2,2),5);
}

assertArrayEquals()

assertArrayEquals() được áp dụng đối với mảng, nó khẳng định rằng mảng mong đợi và mảng thực tế là bằng nhau. Vì có nhiều kiểu mảng như mảng kiểu int, float, double, … nên assertArrayEquals() cũng có các method overloading cho các kiểu dữ liệu khác nhau.

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)

Ví dụ:

@Test
void assertArrayEqualsExample(){
    //Test will pass
    assertArrayEquals(new int[]{1,2,3}, new int[]{1,2,3});

    //Test will failed because element order is different
    assertArrayEquals(new int[]{1,2,3}, new int[]{1,3,2});

    //Test will failed because number of elements are different
    assertArrayEquals(new int[]{1,2,3}, new int[]{1,2,3,4});
}

assertNull() và assertNotnull()

assertNull() khẳng định rằng một object là null. Ngược lại assertNotNull() khẳng định rằng object là not null. Cả hai đều có 3 method overloading:

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)

Ví dụ:

@Test
void assertNull_assertNotNull(){
    String nullString = null;
    String notNullString = "Techmaster";

    //Test will pass
    assertNull(nullString);
    assertNotNull(notNullString);

    //Test will failed
    assertNull(notNullString);
    assertNotNull(nullString);
}

assertTrue() và assetFalse()

assertTrue dùng để xác minh điều kiện phải trả về true.

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)

Ngược lại assertFalse() dùng để xác minh điều kiện trả về là false

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)

Ví dụ:

@Test
void assertTrue_assertFalse(){
    //Test will pass
    assertTrue(true);
    assertFalse(false);
    assertTrue(5 > 4, "5 is greater the 4");
    assertTrue(null == null, "null is equal to null");
    assertFalse(4 > 5, "5 is greater the 4" );

    //Test will failed
    assertTrue(false);
    assertTrue(5 < 4, "4 is greater the 5");
    assertFalse(4 < 5, "4 is greater the 5" );
}

assertSame() và assertNotSame()

assertSame() khẳng định rằng 2 object có cùng tham chiếu tới chính xác cùng một object. Còn assertNotSame() khẳng định rằng 2 object không tham chiếu đến cùng một đối tượng. Cả 2 phương thức đều có 3 method overloading

public static void assertNotSame(Object actual)
public static void assertNotSame(Object actual, String message)
public static void assertNotSame(Object actual, Supplier<> messageSupplier)

public static void assertSame(Object actual)
public static void assertSame(Object actual, String message)
public static void assertSame(Object actual, Supplier<String> messageSupplier)

Ví dụ:

@Test
void assertSame_assertNotSame(){
    String originalObject = "Techmaster";
    String cloneObject = originalObject;
    String otherObject = "JUnit 5";

    //Test will pass
    assertSame(originalObject, cloneObject);
    assertNotSame(originalObject, otherObject);

    //Test will failed
    assertSame(originalObject,originalObject);
    assertNotSame(originalObject,cloneObject);
}

assertTimeout() và assertTimeoutPreemptively()

assertTimeout() và assertTimeoutPreemptively() đều được sử dụng để xác định khoảng thời gian chạy tối đa của test case.

Điểm khác biệt duy nhất giữa chúng là với assertTimeoutPreemotively(), việc thực thi Executable hoặc ThrowingSupplier sẽ bị hủy bỏ trước nếu thời gian chờ bị vượt quá. Còn trong trường hợp assertTimeOut(), Excutable hoặc ThrowingSupplier sẽ không bị hủy bỏ.

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)

Ví dụ:

@Test
void assertTimeout_assertTimeoutPreemptively(){
    //This will pass
    assertTimeout(Duration.ofMinutes(1), () -> {
        return "result";
    });

    //This will fail
    assertTimeout(Duration.ofMillis(100), () -> {
        Thread.sleep(200);
        return "result";
    });

    //This will fail
    assertTimeoutPreemptively(Duration.ofMillis(100), () -> {
        Thread.sleep(200);
        return "result";
    });
}

assertThrows()

assertThrows() xác định rằng việc thực thi Excutable được cung cấp sẽ ném ra một exception của exceptionTYpe và trả về exception

public static <T extends Throwable> T assertThrows(Class<T> expectedType,
Executable executable)

Ví dụ:

@Test
void assertThrowsExample(){
    Throwable exception = assertThrows(IllegalArgumentException.class, () -> {
        throw new IllegalArgumentException("error message");
    });
}

fail()

fail() dùng để đánh dấu một test case chưa hoàn thiện. thường được sử dụng để đánh dấu các test cho những phần task đang trong quá trình phát triển

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)

Ví dụ:

@Test
void failExample() {
     fail("FAIL - try to development");
}

assertAll()

assertAll() được thêm vào từ phiên bản JUnit 5. Nó cho phép tạo một nhóm các assertions, trong đó tất cả các assertions đều được thực thi

Ví dụ:

@Test
void assertAllExamples(){
    assertAll(
            "heading",
            () -> {
                assertTrue(5 > 4, "5 is greater the 4");
                assertFalse(4 > 5, "5 is greater the 4" );
            },
            () -> {
                String nullString = null;
                String notNullString = "Techmaster";

                assertNull(nullString);
                assertNotNull(notNullString);
            },
            () ->{
                assertArrayEquals(new int[]{1,2,3}, new int[]{1,2,3});
            }
    );
}

Trong hướng dẫn này, mình đã đề cập đến các assertions có trong JUnit 5

Code tham khảo: https://github.com/EriChannel/JUnit-5-Tutorial/tree/main/Example/MathUtil

Tham khảo khoá học Java Spring Boot Full Stack 7 tháng tại Techmaster