테스트 컨테이너를 사용한 Micronaut 통합 테스트
5925 단어 testcontainersjunitjavamicronaut
이러한 누락 중 하나는 구성 요소 초기화 전에 런타임에 응용 프로그램 컨텍스트 구성에 정말 편리한 ApplicationContextInitializer입니다. 이 기능은 Testcontainers가 시작하는 각 컨테이너에 대해 임의의 포트를 사용하기 때문에 Testcontainers 인스턴스 호스트 및 포트를 가져오는 데 사용되지만 런타임 시 실제 포트를 쉽게 얻을 수 있습니다.
Spring Boot 구성 및 ApplicationContextInitializer는 에 자세히 설명되어 있으며 여기에서는 Micronaut의 격차를 메우려고 노력할 것입니다.
옵션 1. 게으르고 더 이상 사용되지 않습니다.
withCreateContainerCmdModifier
를 사용하여 무작위 대신 알려진 포트를 설정할 수 있습니다.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);
}
그러나
withPortBindings
더 이상 사용되지 않으며 향후 릴리스에서 제거됩니다. 이 이면의 주요 아이디어는 가상화와 범위 지정입니다. 애플리케이션 테스트는 독립적이어야 하므로 동일한 도커를 사용하여 병렬로 실행할 수 있습니다. 반면에 여러 프로젝트에 자주 사용되는 동일한 Docker/Jenkins 환경에서 이 경우 두 테스트에 동일한 컨테이너가 필요할 때 "0.0.0.0:6379에 대한 바인딩 실패: 포트가 이미 할당되었습니다"라는 메시지가 표시됩니다.옵션2. Micronaut 방식 솔루션.
Micronaut는 testcontainer에서 얻은 호스트/포트 값으로 애플리케이션 구성을 시작하는 개념을 제공합니다
PropertySource
.EmbeddedServer
의 예@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();
}
ApplicationContext
의 예@BeforeAll
public static void initUnitTest() {
context = ApplicationContext.run(PropertySource.of(
"test", Map.of("redis.host", redis.getContainerIpAddress(), "redis.port", redis.getMappedPort(REDIS_PORT))
));
}
종단 간 데모를 찾을 수 있습니다here.
즐거운 코딩과 테스트!
Reference
이 문제에 관하여(테스트 컨테이너를 사용한 Micronaut 통합 테스트), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/major13ua/micronaut-integration-testing-using-testcontainers-2e30텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)