Gymterview
junior

Как настроить профили для тестов?

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

Создание тестовой конфигурации

Файл src/test/resources/application-test.yml:

Пример конфигурации
spring:
  datasource:
    url: jdbc:h2:mem:testdb
    driver-class-name: org.h2.Driver
    username: sa
    password:
  jpa:
    hibernate:
      ddl-auto: create-drop
    show-sql: true
    properties:
      hibernate:
        format_sql: true
  mail:
    host: localhost
    port: 3025

app:
  external-api:
    url: http://localhost:8089/mock-api
  feature:
    notifications-enabled: false

Активация профиля в тестах

Пример
@SpringBootTest
@ActiveProfiles("test")
class UserServiceTest {

    @Value("${app.external-api.url}")
    private String apiUrl;

    @Test
    void shouldUseTestConfiguration() {
        assertEquals("http://localhost:8089/mock-api", apiUrl);
    }
}

Несколько профилей

Пример
@SpringBootTest
@ActiveProfiles({"test", "local"})
class MultiProfileTest {
    // Загружает application-test.yml и application-local.yml
}

Переопределение отдельных свойств

Пример
// Через @SpringBootTest
@SpringBootTest(properties = {
    "app.feature.notifications-enabled=false",
    "spring.jpa.show-sql=true"
})
class PropertyOverrideTest { /* ... */ }

// Через @TestPropertySource
@SpringBootTest
@TestPropertySource(locations = "classpath:custom-test.properties")
class CustomPropertyTest { /* ... */ }

@SpringBootTest
@TestPropertySource(properties = {
    "app.timeout=5000",
    "app.retry-count=3"
})
class InlinePropertyTest { /* ... */ }

Spring Boot сначала ищет файлы конфигурации в src/test/resources. Если там есть application.properties или application.yml, он используется вместо файла из src/main/resources.

На собеседовании: важно знать приоритет: @TestPropertySource > @SpringBootTest(properties) > application-test.yml > application.yml. Частая ошибка — положить application.properties в src/test/resources и удивляться, что production-конфигурация полностью перекрыта.