«1. Обзор

В этом кратком руководстве мы обсудим, как исключить классы автоконфигурации из тестов Spring Boot.

Функция автоматической настройки Spring Boot очень удобна, поскольку она берет на себя большую часть настройки за нас. Однако это также может быть проблемой во время тестирования, если мы не хотим, чтобы определенная автоматическая конфигурация мешала нашим тестам модуля.

Типичным примером этого является автоматическая настройка безопасности, которую мы также будем использовать в наших примерах.

2. Тестовый пример

Сначала мы рассмотрим наш тестовый пример.

У нас будет защищенное приложение Spring Boot с простой домашней страницей.

Когда мы пытаемся получить доступ к домашней странице без аутентификации, ответ «401 UNAUTHORIZED».

Давайте посмотрим на это в тесте, который использует REST-assured для выполнения вызова:

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

С другой стороны, мы можем успешно получить доступ к домашней странице с аутентификацией:

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

В следующих разделах , мы попробуем различными способами исключить класс SecurityAutoConfiguration из конфигурации наших тестов.

3. Использование @EnableAutoConfiguration

Есть несколько способов исключить конкретный класс автоконфигурации из конфигурации тестов.

Во-первых, давайте посмотрим, как мы можем использовать аннотацию @EnableAutoConfiguration(exclude={CLASS_NAME}):

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

В этом примере мы исключили класс SecurityAutoConfiguration с помощью атрибута exclude, но мы можем сделать то же самое с любой из классов автоконфигурации.

Теперь мы можем запустить наш тест, который обращается к домашней странице без аутентификации, и он больше не будет давать сбоев.

4. Использование @TestPropertySource

Далее мы можем использовать @TestPropertySource для внедрения свойства «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 {
    // ...
}

Обратите внимание, что нам нужно указать полное имя класса (пакет имя+простое имя) для свойства.

5. Использование профилей

Мы также можем установить свойство «spring.autoconfigure.exclude» для наших тестов, используя профили:

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

И включить все свойства профиля «test» в application-test .properties:

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

6. Использование пользовательской тестовой конфигурации

Наконец, мы можем использовать отдельное приложение конфигурации для наших тестов:

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

И исключить класс автоконфигурации из @SpringBootApplication(exclude ={CLASS_NAME}):

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

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

7. Заключение

В этой статье мы рассмотрели различные способы исключения классов автоконфигурации из тестов Spring Boot.

Полный исходный код доступен на GitHub.