4.1 @Đã tắt

Bây giờ hãy xem xét một số chú thích rất hữu ích và phổ biến của khung JUnit. Chú thích đầu tiên cho phép bạn tắt một bài kiểm tra cụ thể để JUnit không gọi nó. Nó cần thiết trong trường hợp bạn nhận thấy rằng bài kiểm tra không hoạt động chính xác hoặc bạn thay đổi mã và bài kiểm tra vô tình bị hỏng.

Như tôi đã viết trước đó, 99% các bài kiểm tra không được hỗ trợ bởi bất kỳ ai, vì vậy sớm muộn gì chúng cũng bị vô hiệu hóa. Do đó, chú thích này là chú thích đầu tiên trong danh sách hữu ích.

Hãy xem xét ví dụ của cô ấy:

public class AppTest {

    @Disabled("Test is temporarily disabled. True, true")
    @Test
    void testOnDev(){
        System.setProperty("ENV", "DEV");
        Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
    }

    @Test
    void testOnProd(){
     System.setProperty("ENV", "PROD");
        Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
    }
}

Trong ví dụ trên, phương thức testOnDev()sẽ không được gọi. Nhân tiện, chú thích @Disabledcó thể được viết ngay trước khi khai báo lớp, sau đó tất cả các phương thức của nó sẽ bị bỏ qua.

@Disabled("Temporarily turned off the test, we will fix it by May 2001")
public class AppTest {
    @Test
    void testOnDev(){
        System.setProperty("ENV", "DEV");
        Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
    }

    @Test
    void testOnProd(){
     System.setProperty("ENV", "PROD");
        Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
    }
}

4.2 @Neded

JUnit cho phép bạn gọi các phương thức kiểm tra trên các lớp lồng nhau. Ý tôi là các lớp kiểm tra lồng nhau. Không phải thực tế là bạn sẽ thường xuyên gặp phải chúng, nhưng vẫn có khả năng như vậy, vì vậy bạn cần hiểu nó là gì.

Để gọi các phương thức của một lớp lồng nhau trước khi khai báo, bạn cần viết một chú thích @Nested. Ví dụ:

public class AppTest {
    @Nested
    public class DevStagingEnvironment {
    @Test
        void testOnDev(){
            System.setProperty("ENV", "DEV");
            Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
        }
   }

    @Nested
    public class ProductionEnvironment {
        @Test
        void testOnProd(){
           System.setProperty("ENV", "PROD");
           Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
        }
   }
}

Thông tin chi tiết có thể được tìm thấy trong tài liệu chính thức .

4.3 @ExtendWith

Một chú thích hữu ích khác là @ExtendWith. Rất có thể bạn sẽ gặp cô ấy rất thường xuyên, vì vậy hãy xem xét cô ấy chi tiết hơn.

JUnit là một khung mạnh mẽ cho phép bạn viết nhiều plugin (tiện ích mở rộng) khác nhau để tùy chỉnh linh hoạt cho công việc của bạn. Một số tiện ích mở rộng có thể thu thập số liệu thống kê về các lần kiểm tra, một số tiện ích mở rộng khác có thể mô phỏng hệ thống tệp trong bộ nhớ, những tiện ích mở rộng khác có thể mô phỏng hoạt động bên trong máy chủ web, v.v.

Nếu mã của bạn đang chạy bên trong một khung (ví dụ: Spring), thì hầu như khung này luôn quản lý việc tạo và cấu hình các đối tượng trong mã của bạn . Do đó, một plugin thử nghiệm đặc biệt là không thể thiếu. Ví dụ:

Ví dụ 1. Phần mở rộng WebServerExtensionchuyển sang phương thức kiểm tra được gọi URLđể hoạt động chính xác.

@Test
@ExtendWith(WebServerExtension.class)
void getProductList(@WebServerUrl String serverUrl) {
    WebClient webClient = new WebClient();
    // Use WebClient to connect to web server using serverUrl and verify response
    assertEquals(200, webClient.get(serverUrl + "/products").getResponseStatus());
}

Đây là cách các bài kiểm tra thường bắt đầu để kiểm tra mã hoạt động với khung công tác Spring:

@ExtendWith(SpringExtension.class)
@ExtendWith(MockitoExtension.class)
class TestServiceTest {

    @MockBean
    TestService service;

    @Test
    void test() {
        assertNotNull(service); // Test succeeds
    }
}

SpringExtensiontạo phiên bản thử nghiệm của khung công tác Spring, nhưng MockitoExtentioncho phép bạn tạo các đối tượng giả mạo. Đồ giả là một chủ đề rất thú vị, chúng tôi chắc chắn sẽ đề cập đến nó, nhưng một lát sau.

4.4 @Hết giờ

Hãy kết thúc bài giảng này với một chú thích nhỏ và thú vị @Timeout. Nó cho phép bạn thiết lập thời gian để chạy thử nghiệm. Nếu quá trình kiểm tra mất nhiều thời gian hơn so với quy định trong chú thích, thì quá trình đó được coi là không đạt.

class TimeoutDemo {
    @Test
    @Timeout(value = 100, unit = TimeUnit.MILLISECONDS)
    void failsIfExecutionTimeExceeds100Milliseconds() {
        // test will fail if it takes more than 100 milliseconds
    }
}

Điều này kết thúc bài giảng của chúng tôi.