Перейти к основному содержимому

Исключить классы автоконфигурации в весенних загрузочных тестах

· 3 мин. чтения

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 {
// ...
}

И включите все свойства « тестового » профиля в 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 .