/ / Cách tạo tiêm phụ thuộc trong JUnit

Cách tạo tiêm phụ thuộc trong JUnit

Mục đích của bài kiểm tra đơn vị là để xác định các lỗi trong ứng dụng càng sớm càng tốt. Mặc dù một số kênh có thể dẫn bạn đến cùng một mục tiêu, nhưng bạn nên hướng đến việc sử dụng tuyến đường hiệu quả nhất.


Một bộ thử nghiệm JUnit có thể có một số lớp thử nghiệm cần cùng một dữ liệu, nhưng bạn không thể sử dụng lại dữ liệu thử nghiệm. Trong các phiên bản trước của JUnit, một cách tiếp cận tốt là tạo một phương thức tiện ích, sau đó gọi phương thức đó mỗi khi một lớp thử nghiệm cần dữ liệu của nó.

JUnit 5 cung cấp một cách tiếp cận hiệu quả hơn cho vấn đề này: tiêm phụ thuộc (DI).


Tiêm phụ thuộc là gì?

DI là một mẫu thiết kế trong đó một đối tượng cung cấp các phụ thuộc của một đối tượng khác. Khi bạn đang xây dựng một ứng dụng Java, bạn có thể có một lớp phụ thuộc vào một đối tượng mà một lớp khác tạo ra để thực hiện chức năng của nó.

Trước khi tiêm phụ thuộc, để sử dụng một đối tượng từ một lớp khác, bạn sẽ phải tạo một thể hiện mới của đối tượng đó trong lớp phụ thuộc vào nó. Vì vậy, nếu bạn có một số lớp phụ thuộc vào cùng một đối tượng, bạn phải tạo một số trường hợp của nó trong các lớp phụ thuộc.

DI cho phép bạn sử dụng một đối tượng trong một lớp phụ thuộc mà không cần tạo một thể hiện mới của nó trong lớp đó.

Dependency Injection trong JUnit 5

JUnit 5 cho phép bạn chèn các phụ thuộc vào cả phương pháp thử nghiệm và phương thức khởi tạo. Điều này rất quan trọng vì các phiên bản trước của khung công tác không cho phép các phương pháp kiểm tra hoặc hàm tạo có tham số.

JUnit 5 cho phép bạn đưa vào bao nhiêu tham số tùy thích. Điểm duy nhất là API ParameterResolver phải có khả năng phân giải từng tham số tại thời điểm chạy. JUnit hiện có ba trình phân giải tham số tích hợp sẵn mà nó sử dụng tự động. Để sử dụng bất kỳ trình phân giải nào khác, bạn cần phải đăng ký nó một cách rõ ràng bằng cách sử dụng chú thích @ExtendWith.

Tiêm phụ thuộc trong JUnit

Chương trình mẫu này sử dụng một trong các tham số tích hợp sẵn của JUnit (TestInfoParameterResolver), để chứng minh cách bạn có thể đưa phần phụ thuộc vào thử nghiệm JUnit 5. TestInfoParameterResolver giải quyết các đối tượng thuộc giao diện TestInfo. Vì vậy, JUnit 5 sẽ cung cấp một thể hiện của giao diện TestInfo cho bất kỳ phương thức hoặc hàm tạo nào sử dụng nó.

import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInfo;

class InfoTestInterfaceTest {
InfoTestInterfaceTest(TestInfo testInfo) {
assertEquals("InfoTestInterfaceTest", testInfo.getDisplayName());
}


@Test
void testMethodName(TestInfo testInfo) {
assertEquals("testMethodName(TestInfo)", testInfo.getDisplayName());
}

@Test
@DisplayName("method using the @DisplayName annotation")
void testMethodNameTwo(TestInfo testInfo) {
assertEquals("method using the @DisplayName annotation", testInfo.getDisplayName());
}
}

Kiểm tra JUnit ở trên trình bày cách đưa một đối tượng vào một phương thức khởi tạo và hai phương thức. Giao diện JUnit TestInfo có bốn phương thức mà bạn có thể sử dụng với đối tượng của nó.

Phương thức getDisplayName () là hữu ích nhất. Nó trả về tên hiển thị của phương thức kiểm tra hoặc hàm tạo hiện tại. Theo mặc định, tên này dựa trên lớp. Nhưng nếu bạn sử dụng chú thích @DisplayName, phương thức getDisplayName () sẽ trả về văn bản đó thay thế.

Lớp thử nghiệm ở trên tạo báo cáo thử nghiệm sau:

Sử dụng DI trong các phương thức @Before và @After

Có bốn loại phương thức được chú thích JUnit khác hỗ trợ các phụ thuộc. Đây là các chú thích @BeforeAll, @BeforeEach, @AfterAll và @AfterEach. Giống như phương thức @Test, tất cả những gì bạn cần làm là chuyển một đối tượng cho bất kỳ phương thức nào trong số các phương thức trước hoặc sau làm tham số và bạn đã sẵn sàng.

Các chú thích @Before và @After rất quan trọng, vì chúng cũng giúp bạn phát triển mã thử nghiệm hiệu quả hơn. Có khả năng cũng đưa các phụ thuộc vào các phương pháp này sẽ cải thiện hơn nữa mã thử nghiệm của bạn.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *