1. Обзор
В этом кратком руководстве мы обсудим как исключить классы автоматической настройки из тестов загрузки Spring .
Функция автоматической настройки Spring Boot очень удобна, так как она заботится о многих настройках для нас. Однако это также может быть проблемой во время тестирования, если мы не хотим, чтобы определенная автоматическая конфигурация мешала нашим тестам модуля.
Распространенным примером этого является автоматическая настройка безопасности, которую мы также будем использовать для наших примеров.
2. Тестовый пример
Во-первых, мы рассмотрим наш пример тестирования.
У нас будет защищенное приложение Spring Boot с простой домашней страницей.
Когда мы пытаемся получить доступ к домашней странице без аутентификации, ответ “401 НЕСАНКЦИОНИРОВАННЫЙ”.
Давайте посмотрим на это в тесте, который использует 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 , но мы можем сделать то же самое с любым из классов auto-configuration .
Теперь мы можем запустить наш тест, который обращается к домашней странице без аутентификации, и он больше не будет сбоить.
4. Использование @TestPropertySource
Далее, мы можем использовать @TestPropertySource для введения свойства “ spring.auto configure.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. Использование профилей
Мы также можем установить свойство ” Мы также можем установить свойство ” “для наших тестов используются профили:
@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.
Полный исходный код доступен на GitHub .