4.1 @Wyłączone

Przyjrzyjmy się teraz kilku bardzo przydatnym i popularnym adnotacjom dotyczącym frameworka JUnit. Pierwsza adnotacja pozwala wyłączyć konkretny test, aby JUnit go nie wywoływał. Jest potrzebny w przypadkach, gdy zauważysz, że test nie działa poprawnie lub zmieniłeś kod i test przypadkowo się zepsuł.

Jak pisałem wcześniej, 99% testów nie jest przez nikogo wspieranych, więc wszystkie prędzej czy później okazują się wyłączone. Dlatego ta adnotacja jest pierwszą na liście przydatnych.

Rozważ jej przykład:

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

W powyższym przykładzie metoda testOnDev()nie zostanie wywołana. Nawiasem mówiąc, adnotację @Disabledmożna napisać bezpośrednio przed deklaracją klasy, wtedy wszystkie jej metody zostaną zignorowane.

@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 @Zagnieżdżone

JUnit umożliwia wywoływanie metod testowych w klasach zagnieżdżonych. Mam na myśli zagnieżdżone klasy testowe. Nie jest faktem, że często je spotkasz, ale istnieje taka możliwość, więc musisz zrozumieć, co to jest.

Aby wywołać metody klasy zagnieżdżonej przed jej deklaracją, należy napisać adnotację @Nested. Przykład:

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

Więcej szczegółów można znaleźć w oficjalnej dokumentacji .

4.3 @Rozszerz o

Inną użyteczną adnotacją jest @ExtendWith. Najprawdopodobniej spotkasz ją bardzo często, więc przyjrzyjmy się jej bardziej szczegółowo.

JUnit to potężny framework, który umożliwia pisanie różnych wtyczek (rozszerzeń) w celu elastycznego dostosowywania Twojej pracy. Niektóre rozszerzenia mogą zbierać statystyki dotyczące testów, inne mogą emulować system plików w pamięci, inne mogą emulować pracę na serwerze WWW i tak dalej.

Jeśli twój kod działa w frameworku (na przykład Spring), prawie zawsze ten framework zarządza tworzeniem i konfiguracją obiektów w twoim kodzie . Dlatego niezbędna jest specjalna wtyczka testowa. Przykłady:

Przykład 1. Rozszerzenie WebServerExtensionprzekazuje wywoływaną metodę testową URL, aby działała poprawnie.

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

W ten sposób testy zwykle rozpoczynają testowanie kodu, który działa z frameworkiem Spring:

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

    @MockBean
    TestService service;

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

SpringExtensiontworzy testową wersję frameworka Spring, ale MockitoExtentionpozwala na tworzenie fałszywych obiektów. Fałszywe przedmioty to bardzo ciekawy temat, na pewno go poruszymy, ale trochę później.

4.4 @Przekroczono limit czasu

Zakończmy ten wykład małą i ciekawą adnotacją @Timeout. Pozwala ustawić czas uruchomienia testu. Jeśli test zajął więcej czasu niż podano w adnotacji, uznaje się go za nieudany.

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

Na tym kończymy nasz wykład.