4.1 @Забранено

Сега нека да разгледаме някои много полезни и популярни анотации на рамката JUnit. Първата анотация ви позволява да изключите конкретен тест, така че JUnit да не го извиква. Необходим е в случаите, когато забележите, че тестът не работи правилно, or промените codeа и тестът случайно се повреди.

Както писах по-рано, 99% от тестовете не се поддържат от никого, така че всички те рано or късно се оказват деактивирани. Следователно тази анотация е първата в списъка с полезни.

Помислете за нейния пример:

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 ви позволява да извиквате тестови методи на вложени класове. Имам предвид вложени тестови класове. Не е факт, че често ще ги срещате, но има такава възможност, така че трябва да разберете Howво е това.

За да извикате методите на вложен клас преди неговата декларация, трябва да напишете анотация @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")));
        }
   }
}

Повече подробности можете да намерите в официалната documentация .

4.3 @ExtendWith

Друга полезна анотация е @ExtendWith. Най-вероятно ще я срещате много често, така че нека я разгледаме по-подробно.

JUnit е мощна рамка, която ви позволява да пишете различни добавки (разширения) за гъвкаво персонализиране на вашата работа. Някои разширения могат да събират статистически данни за тестове, други могат да емулират файлова система в паметта, трети могат да емулират работа в уеб сървър и т.н.

Ако вашият code се изпълнява в рамка (например Spring), тогава почти винаги тази рамка управлява създаването и конфигурацията на обекти във вашия code . Следователно, специален тестов плъгин е незаменим. Примери:

Пример 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());
}

Ето How тестовете обикновено започват да тестват code, който работи с Spring framework:

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

    @MockBean
    TestService service;

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

SpringExtensionсъздава тестова version на рамката 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
    }
}

С това нашата лекция приключва.