Tags:

@BeforeEach, @BeforeAll, @AfterEach và @AfterAll JUnit 5

@BeforeEach, @BeforeAll là 2 annotation mới được giới thiệu trong JUnit 5 thay thế @Before@BeforeClass trong JUnit 4, tương tự @AfterEach thay thế cho @After@AfterAll thay thế cho @AfterClass.

@BeforeEach và @BeforeAll

@BeforeEach annotation chỉ định một method thực thi trước mỗi test method trong cùng class. Nó sẽ hữu dụng khi các bạn muốn thực thi một vài đoạn mã chung như làm mới hoặc chuẩn bị dữ liệu etc.

Ví dụ sử dụng @BeforeEach để khởi tạo dữ liệu ban đầu cho các test method

public class LifeCylcleExample {
    private List<String> list = new ArrayList<>();

    @BeforeEach
    void init() {
        System.out.println("Init");
        list.add("test 1");
        list.add("test 2");
    }

    @Test
    public void testMethod() {
        System.out.println("Test");
        assertEquals(2, list.size());
    }
}

Kết quả thực thi testMethod(): 

Init
Test

@BeforeAll chỉ định method sẽ được thực thi 1 lần khi 1 test class khởi chạy. Sử dụng @BeforeAll method để cài đặt môi trường cần thiết cho các test method như kết nối database, mock dữ liệu hoặc chuẩn bị các dữ liệu chung chỉ được khởi tạo 1 lần trong vòng đời của test class. Lưu ý @BeforeAll phải là static method.

public class LifeCylcleExample {
    private List<String> list = new ArrayList<>();

    @BeforeEach
    void init() {
        System.out.println("Init");
        list.add("test 1");
        list.add("test 2");
    }

    @BeforeAll
    static void setUp() {
        System.out.println("setUp");
        System.out.println("connect to database");
    }

    @Test
    public void testMethod() {
        System.out.println("Test");
        assertEquals(2, list.size());
    }
}

Output:

setUp
connect to database
Init
Test

@AfterEach và @AfterAll

Sau mỗi test method được chạy, nó có thể tạo ra các dữ liệu mới trong quá trình tính toán của nó, như thêm record xuống data base, xóa hoặc cập nhật data. Điều này có thể ảnh hưởng đến các test method chạy sau khi mà chúng bị ảnh hưởng bởi test method trước. Sử dụng @AfterEach để reset dữ liệu bị thay đổi bởi test method vừa thực thi xong.

package lifecylcle;

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.util.ArrayList;
import java.util.List;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

public class LifeCylcleExample {

    private List<String> list = new ArrayList<>();

    @BeforeEach
    void init() {
        System.out.println("Init");
        list.add("test 1");
        list.add("test 2");
    }

    @BeforeAll
    static void setUp() {
        System.out.println("setUp");
        System.out.println("connect to database");
    }

    @Test
    public void testMethod() {
        System.out.println("Test");
        list.add("test method");
        assertEquals(3, list.size());
    }

    @AfterEach
    public void afterEach() {
        System.out.println("After each");
        list.clear();
    }
}

Output

setUp
connect to database
Init
Test
After each

Sau khi test class thực thi xong chúng ta cũng cần reset trạng thái về như ban đầu như ngắt kết nối xuống database, xóa các dữ liệu chung được tạo ra bởi @BeforeAll method. @AfterAll chỉ định method sẽ được thi cuối cùng sau khi các test method trong test class thực thi xong. Lưu ý @AfterAll method phải là static method.

package lifecylcle;

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.util.ArrayList;
import java.util.List;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

public class LifeCylcleExample {

    private List<String> list = new ArrayList<>();

    @BeforeEach
    void init() {
        System.out.println("Init");
        list.add("test 1");
        list.add("test 2");
    }

    @BeforeAll
    static void setUp() {
        System.out.println("setUp");
        System.out.println("connect to database");
    }

    @Test
    public void testMethod() {
        System.out.println("Test");
        list.add("test method");
        assertEquals(3, list.size());
    }

    @AfterEach
    public void afterEach() {
        System.out.println("After each");
        list.clear();
    }

    @AfterAll
    public void tearDown() {
        System.out.println("After each");
        System.out.println("Close connect to database");
    }
}

Output:

setUp
connect to database
Init
Test
After each
After each
Close connect to database

Tóm lược

Các @Before, @BeforeAll, @After, @AfterAll là những annotation được sử dụng hầu hết trong các test class để xây dựng môi trường cần thiết cho test method.

Nếu có vấn đề trong quá trình thử nghiệm bạn có thể tham khảo project mình tại github để so sánh.

Tài liệu tham khảo

https://www.baeldung.com/junit-before-beforeclass-beforeeach-beforeall

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x