Excluir classes de configuração automática nos testes de inicialização do Spring

Excluir classes de configuração automática nos testes de inicialização do Spring

1. Visão geral

Neste tutorial rápido, discutiremoshow to exclude auto-configuration classes from Spring Boot tests.

Spring Boot’s auto-configuration feature é muito útil, pois cuida de muitas configurações para nós. No entanto, isso também pode ser um problema durante o teste, se não quisermos que uma determinada configuração automática interfira em nossos testes de um módulo.

Um exemplo comum disso é a configuração automática de segurança, que também usaremos em nossos exemplos.

2. Exemplo de teste

Primeiro, vamos dar uma olhada em nosso exemplo de teste.

Teremos um aplicativo Spring Boot seguro com uma página inicial simples.

Quando tentamos acessar a página inicial sem autenticação, a resposta é "401 NÃO AUTORIZADO".

Vamos ver isso em um teste que usaREST-assured para fazer a chamada:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.DEFINED_PORT)
public class AutoConfigIntegrationTest {

    @Test
    public void givenNoAuthentication_whenAccessHome_thenUnauthorized() {
        int statusCode = RestAssured.get("http://localhost:8080/").statusCode();

        assertEquals(HttpStatus.UNAUTHORIZED.value(), statusCode);
    }

}

Por outro lado, podemos acessar a página inicial com êxito com autenticação:

@Test
public void givenAuthentication_whenAccessHome_thenOK() {
    int statusCode = RestAssured.given().auth().basic("john", "123")
      .get("http://localhost:8080/")
      .statusCode();

    assertEquals(HttpStatus.OK.value(), statusCode);
}

Nas seções a seguir, configuração dewe’ll try different ways to exclude the SecurityAutoConfiguration class from our tests'.

3. Usando@EnableAutoConfiguration

Existem várias maneiras de excluir uma classe de configuração automática específica da configuração dos testes.

Primeiro,let’s see how we can use the @EnableAutoConfiguration(exclude={CLASS_NAME}) annotation:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.DEFINED_PORT)
@EnableAutoConfiguration(exclude=SecurityAutoConfiguration.class)
public class ExcludeAutoConfigIntegrationTest {

    @Test
    public void givenSecurityConfigExcluded_whenAccessHome_thenNoAuthenticationRequired() {
        int statusCode = RestAssured.get("http://localhost:8080/").statusCode();

        assertEquals(HttpStatus.OK.value(), statusCode);
    }
}

Neste exemplo, excluímos oSecurityAutoConfiguration class usando o atributoexclude, mas podemos fazer o mesmo com qualquer um dosauto-configuration classes.

Agora podemos executar nosso teste que acessa a página inicial sem autenticação e ela não falha mais.

4. Usando@TestPropertySource

A seguir,we can use @TestPropertySource to inject the property “spring.autoconfigure.exclude:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.DEFINED_PORT)
@TestPropertySource(properties =
 "spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration")
public class ExcludeAutoConfigIntegrationTest {
    // ...
}

Observe que precisamos especificar o nome completo da classe (nome do pacote + nome simples) para a propriedade

5. Usando Perfis

Também podemos definir a propriedade “spring.autoconfigure.exclude” para nossos testes usando perfis:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.DEFINED_PORT)
@ActiveProfiles("test")
public class ExcludeAutoConfigIntegrationTest {
    // ...
}

E inclua todas as propriedades específicas do perfil “test” emapplication-test.properties:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration

6. Usando uma configuração de teste personalizada

Finalmente,we can use a separate configuration application for our tests:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestApplication.class, webEnvironment = WebEnvironment.DEFINED_PORT)
public class ExcludeAutoConfigIntegrationTest {
    // ...
}

E exclua a classe de configuração automática de@SpringBootApplication(exclude={CLASS_NAME}):

@SpringBootApplication(exclude=SecurityAutoConfiguration.class)
public class TestApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }
}

7. Conclusão

Neste artigo, exploramos maneiras diferentes de excluir classes de configuração automática dos testes do Spring Boot.

O código-fonte completo está disponívelover on GitHub.