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”