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 @Disabled
pode 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 WebServerExtension
passa para o método de teste chamado URL
para 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
}
}
SpringExtension
cria uma versão de teste do framework Spring, mas MockitoExtention
permite 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.
GO TO FULL VERSION