Рубрики
Без рубрики

Интеграционное тестирование Micronaut с использованием тестовых контейнеров

Micronaut – это современная платформа полного стека на базе JVM для создания модульных, легко тестируемых микросер… Помечен как java, micronaut, тестовые контейнеры, junit.

Micronaut – это современная платформа полного стека на базе JVM для создания модульных, легко тестируемых микросервисных и бессерверных приложений. Концепции, API, аннотации и соглашения аналогичны Spring Framework, но некоторые функции должны быть выполнены по-другому или отсутствовать.

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

Конфигурация Spring Boot и ApplicationContextInitializer подробно описаны в статье, и здесь я постараюсь восполнить пробел для Micronaut.

Вариант 1. Ленивый и устаревший.

с помощью модификатора CreateContainerCmd можно было бы использовать для установки известного порта вместо случайного.

public abstract class ResourceProvider {

    private static final int REDIS_PORT = 6379;

    @Container
    static GenericContainer redis = new GenericContainer<>("redis:5.0.8-alpine")
            .withCreateContainerCmdModifier(it -> it.withName("redis-unit")
                    .withPortBindings(new PortBinding(Ports.Binding.bindPort(REDIS_PORT), new ExposedPort(REDIS_PORT))))
            .withExposedPorts(REDIS_PORT);

}

но с привязками портов устарел и будет удален в будущих выпусках. Основная идея, лежащая в основе этого, – виртуализация и масштабирование. Тесты вашего приложения должны быть независимыми, чтобы их можно было выполнять параллельно, используя один и тот же докер. С другой стороны, та же среда Docker/Jenkins часто используется для нескольких проектов, и в этом случае вы получите сообщение “Ошибка привязки для 0.0.0.0:6379: порт уже выделен”, когда для обоих тестов потребуется один и тот же контейнер.

Вариант 2. Решение для микронавтов.

Предложения Micronaut Источник свойств концепция для инициализации конфигурации приложения со значениями хоста/порта, полученными из тестового контейнера. Пример для Встроенного сервера

@BeforeAll
public static void initUnitTest() {

    embeddedServer = ApplicationContext.run(EmbeddedServer.class, PropertySource.of(
            "test", Map.of("redis.host", redis.getContainerIpAddress(), "redis.port", redis.getMappedPort(REDIS_PORT))
    ));

    context = embeddedServer.getApplicationContext();

}

Пример для Контекст приложения

@BeforeAll
public static void initUnitTest() {
    context = ApplicationContext.run(PropertySource.of(
            "test", Map.of("redis.host", redis.getContainerIpAddress(), "redis.port", redis.getMappedPort(REDIS_PORT))
    ));
}

Сквозную демонстрацию можно найти здесь . Счастливого кодирования и тестирования!

Оригинал: “https://dev.to/major13ua/micronaut-integration-testing-using-testcontainers-2e30”