4.1 @Desativado

Agora vamos ver algumas anotações muito úteis e populares do framework JUnit. A primeira anotação permite desligar um teste específico para que o JUnit não o chame. É necessário nos casos em que você percebe que o teste não está funcionando corretamente ou altera o código e o teste falha acidentalmente.

Como escrevi anteriormente, 99% dos testes não são suportados por ninguém, então todos acabam sendo desativados mais cedo ou mais tarde. Portanto, esta anotação é a primeira na lista de úteis.

Considere o exemplo dela:

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

No exemplo acima, o método testOnDev()não será chamado. A propósito, a anotação @Disabledpode ser escrita imediatamente antes da declaração da classe, então todos os seus métodos serão ignorados.

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

JUnit permite chamar métodos de teste em classes aninhadas. Quero dizer classes de teste aninhadas. Não é fato que você os encontrará com frequência, mas existe essa possibilidade, então você precisa entender o que é.

Para chamar os métodos de uma classe aninhada antes de sua declaração, você precisa escrever uma anotação @Nested. Exemplo:

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

Mais detalhes podem ser encontrados na documentação oficial .

4.3 @ExtendWith

Outra anotação útil é @ExtendWith. Muito provavelmente você a encontrará com frequência, então vamos examiná-la com mais detalhes.

JUnit é uma estrutura poderosa que permite escrever vários plug-ins (extensões) para personalização flexível do seu trabalho. Algumas extensões podem coletar estatísticas sobre testes, outras podem emular um sistema de arquivos na memória, outras podem emular o trabalho dentro de um servidor web e assim por diante.

Se seu código estiver sendo executado dentro de um framework (por exemplo, Spring), quase sempre esse framework gerencia a criação e configuração de objetos em seu código . Portanto, um plugin de teste especial é indispensável. Exemplos:

Exemplo 1. A extensão WebServerExtensionpassa para o método de teste chamado URLpara funcionar corretamente.

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

É assim que os testes geralmente começam a testar o código que funciona com o framework Spring:

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

    @MockBean
    TestService service;

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

SpringExtensioncria uma versão de teste do framework Spring, mas MockitoExtentionpermite que você crie objetos falsos. Objetos falsos é um assunto muito interessante, com certeza vamos tocar nele, mas um pouco mais tarde.

4.4 @Timeout

Vamos terminar esta palestra com uma pequena e interessante anotação @Timeout. Ele permite que você defina o tempo para executar o teste. Se o teste demorou mais do que o especificado na anotação, então é considerado reprovado.

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

Isso conclui nossa palestra.