4.1 @Uitgeschakeld

Laten we nu eens kijken naar enkele zeer nuttige en populaire annotaties van het JUnit-framework. Met de eerste annotatie kunt u een specifieke test uitschakelen zodat JUnit deze niet aanroept. Het is nodig in gevallen waarin u merkt dat de test niet correct werkt, of u de code wijzigt en de test per ongeluk breekt.

Zoals ik al eerder schreef wordt 99% van de testen door niemand ondersteund, dus vroeg of laat blijken ze allemaal uitgeschakeld te zijn. Daarom is deze annotatie de eerste in de lijst met nuttige.

Overweeg haar voorbeeld:

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

In het bovenstaande voorbeeld testOnDev()wordt de methode niet aangeroepen. Trouwens, de annotatie @Disabledkan direct vóór de klassendeclaratie worden geschreven, dan worden alle methoden ervan genegeerd.

@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 @Genest

Met JUnit kunt u testmethoden aanroepen voor geneste klassen. Ik bedoel geneste testklassen. Het is geen feit dat je ze vaak zult tegenkomen, maar er is zo'n mogelijkheid, dus je moet begrijpen wat het is.

Om de methoden van een geneste klasse aan te roepen voordat deze wordt gedeclareerd, moet u een annotatie schrijven @Nested. Voorbeeld:

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

Meer details zijn te vinden in de officiële documentatie .

4.3 @ExtendWith

Een andere handige annotatie is @ExtendWith. Hoogstwaarschijnlijk zul je haar heel vaak ontmoeten, dus laten we haar in meer detail bekijken.

JUnit is een krachtig framework waarmee je verschillende plug-ins (extensies) kunt schrijven voor flexibele aanpassing van je werk. Sommige extensies kunnen statistieken over tests verzamelen, andere kunnen een in-memory bestandssysteem emuleren, andere kunnen het werken binnen een webserver emuleren, enzovoort.

Als uw code binnen een raamwerk draait (bijvoorbeeld Spring), beheert dit raamwerk bijna altijd het maken en configureren van objecten in uw code . Daarom is een speciale testplug-in onmisbaar. Voorbeelden:

Voorbeeld 1. De extensie WebServerExtensiongaat over naar de aangeroepen testmethode URLom correct te werken.

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

Dit is hoe tests meestal beginnen met het testen van code die werkt met het Spring-framework:

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

    @MockBean
    TestService service;

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

SpringExtensionmaakt een testversie van het Spring-framework, maar MockitoExtentionstelt u in staat om nep-objecten te maken. Nepvoorwerpen is een heel interessant onderwerp, we zullen het zeker bespreken, maar iets later.

4.4 @Time-out

Laten we deze lezing afsluiten met een kleine en interessante aantekening @Timeout. Hiermee kunt u de tijd instellen om de test uit te voeren. Als de test meer tijd kostte dan gespecificeerd in de annotatie, wordt deze als mislukt beschouwd.

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

Hiermee sluiten we onze lezing af.