Интеграционное тестирование в Spring: TestContext Framework, конфигурация контекста с динамическими источниками свойств

Начиная с Spring Framework 5.2.5, TestContext framework обеспечивает поддержку динамических свойств через аннотацию @DynamicPropertySource. Эту аннотацию можно использовать в интеграционных тестах, которым необходимо добавить свойства с динамическими значениями в набор PropertySources в Environment для ApplicationContext, загруженного для интеграционного теста.

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

В отличие от аннотации @TestPropertySource, которая применяется на уровне класса, @DynamicPropertySource необходимо применять к статическому методу, который принимает один аргумент DynamicPropertyRegistry, который используется для добавления пар ключ-значение в среду. Значения являются динамическими и предоставляются через поставщика, который вызывается только после разрешения свойства. Обычно ссылки на методы используются для предоставления значений, как можно увидеть в следующем примере, в котором проект Testcontainers используется для управления контейнером Redis вне Spring ApplicationContext. IP-адрес и порт управляемого контейнера Redis становятся доступными для компонентов в ApplicationContext теста через свойства redis.host и redis.port. К этим свойствам можно получить доступ через абстракцию Spring Environment или ввести непосредственно в компоненты, управляемые Spring, например, через @Value("${redis.host}") и @Value("${redis.port}") соответственно.

@SpringJUnitConfig(/* ... */)
@Testcontainers
class ExampleIntegrationTests {

    @Container
    static RedisContainer redis = new RedisContainer();

    @DynamicPropertySource
    static void redisProperties(DynamicPropertyRegistry registry) {
        registry.add("redis.host", redis::getContainerIpAddress);
        registry.add("redis.port", redis::getMappedPort);
    }

    // тесты ...

}

Приоритет

Динамические свойства имеют более высокий приоритет, чем те, которые загружаются из @TestPropertySource, среды операционной системы, свойств системы Java или источников свойств, добавленных приложением декларативно с помощью @PropertySource или программно. Таким образом, динамические свойства могут использоваться для выборочного переопределения свойств, загруженных через @TestPropertySource, источники системных свойств и источники свойств приложения.


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки