4.1 @禁用

現在讓我們看一下 JUnit 框架的一些非常有用和流行的註釋。第一個註釋允許您關閉特定測試,以便 JUnit 不調用它。如果您注意到測試無法正常工作,或者您更改代碼並且測試意外中斷,則需要它。

正如我之前所寫,99% 的測試都沒有人支持,所以它們遲早會被禁用。因此,此註釋是有用註釋列表中的第一個。

考慮她的例子:

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

在上面的示例中,testOnDev()不會調用該方法。順便說一下,註解@Disabled可以寫在類聲明之前,那麼它的所有方法都將被忽略。

@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 @嵌套

JUnit 允許您在嵌套類上調用測試方法。我的意思是嵌套測試類。你不會經常遇到它們,但有這種可能性,所以你需要了解它是什麼。

要在聲明之前調用嵌套類的方法,您需要編寫一個註解@Nested。例子:

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

可以在官方文檔中找到更多詳細信息。

4.3 @ExtendWith

另一個有用的註解是@ExtendWith. 您很可能會經常見到她,所以讓我們更詳細地了解一下她。

JUnit 是一個強大的框架,允許您編寫各種插件(擴展)以靈活定制您的工作。一些擴展可以收集有關測試的統計信息,其他可以模擬內存中的文件系統,其他可以模擬在 Web 服務器內部工作,等等。

如果您的代碼在一個框架(例如 Spring)中運行,那麼幾乎總是這個框架會管理您代碼中對象的創建和配置。因此,一個專門的測試插件是必不可少的。例子:

示例 1.擴展WebServerExtension傳遞給被調用的測試方法URL以便正常工作。

@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());
}

這就是測試通常如何開始測試與 Spring 框架一起工作的代碼:

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

    @MockBean
    TestService service;

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

SpringExtension創建 Spring 框架的測試版本,但MockitoExtention允許您創建假對象。假對像是一個非常有趣的話題,我們肯定會談到它,但稍後會談。

4.4 @超時

讓我們用一個小而有趣的註解來結束這個講座@Timeout。它允許您設置運行測試的時間。如果測試花費的時間超過註釋中指定的時間,則認為失敗。

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

我們的講座到此結束。