diff --git a/spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/ContainerConnectionDetailsFactory.java b/spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/ContainerConnectionDetailsFactory.java index b4bb38e17e..1e8e0d24ac 100644 --- a/spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/ContainerConnectionDetailsFactory.java +++ b/spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/ContainerConnectionDetailsFactory.java @@ -17,6 +17,7 @@ package org.springframework.boot.testcontainers.service.connection; import java.util.Arrays; +import java.util.List; import java.util.stream.Stream; import org.apache.commons.logging.Log; @@ -61,7 +62,7 @@ public abstract class ContainerConnectionDetailsFactory, */ protected static final String ANY_CONNECTION_NAME = null; - private final String connectionName; + private final List connectionNames; private final String[] requiredClassNames; @@ -80,7 +81,19 @@ public abstract class ContainerConnectionDetailsFactory, * @param requiredClassNames the names of classes that must be present */ protected ContainerConnectionDetailsFactory(String connectionName, String... requiredClassNames) { - this.connectionName = connectionName; + this(Arrays.asList(connectionName), requiredClassNames); + } + + /** + * Create a new {@link ContainerConnectionDetailsFactory} instance with the given + * supported connection names. + * @param connectionNames the supported connection names + * @param requiredClassNames the names of classes that must be present + * @since 3.4.0 + */ + protected ContainerConnectionDetailsFactory(List connectionNames, String... requiredClassNames) { + Assert.notEmpty(connectionNames, "ConnectionNames must contain at least one name"); + this.connectionNames = connectionNames; this.requiredClassNames = requiredClassNames; } @@ -93,8 +106,10 @@ public abstract class ContainerConnectionDetailsFactory, Class[] generics = resolveGenerics(); Class containerType = generics[0]; Class connectionDetailsType = generics[1]; - if (source.accepts(this.connectionName, containerType, connectionDetailsType)) { - return getContainerConnectionDetails(source); + for (String connectionName : this.connectionNames) { + if (source.accepts(connectionName, containerType, connectionDetailsType)) { + return getContainerConnectionDetails(source); + } } } catch (NoClassDefFoundError ex) { diff --git a/spring-boot-project/spring-boot-testcontainers/src/test/java/org/springframework/boot/testcontainers/service/connection/ContainerConnectionDetailsFactoryTests.java b/spring-boot-project/spring-boot-testcontainers/src/test/java/org/springframework/boot/testcontainers/service/connection/ContainerConnectionDetailsFactoryTests.java index 09594242d7..f5cc2b4e28 100644 --- a/spring-boot-project/spring-boot-testcontainers/src/test/java/org/springframework/boot/testcontainers/service/connection/ContainerConnectionDetailsFactoryTests.java +++ b/spring-boot-project/spring-boot-testcontainers/src/test/java/org/springframework/boot/testcontainers/service/connection/ContainerConnectionDetailsFactoryTests.java @@ -16,6 +16,8 @@ package org.springframework.boot.testcontainers.service.connection; +import java.util.Collections; +import java.util.List; import java.util.Map; import org.junit.jupiter.api.BeforeEach; @@ -34,6 +36,7 @@ import org.springframework.context.ApplicationContext; import org.springframework.core.annotation.MergedAnnotation; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; import static org.assertj.core.api.Assertions.assertThatIllegalStateException; import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.then; @@ -83,6 +86,14 @@ class ContainerConnectionDetailsFactoryTests { assertThat(connectionDetails).isNotNull(); } + @Test + void getConnectionDetailsWhenTypesMatchAndNameRestrictionsMatchReturnsDetails() { + TestContainerConnectionDetailsFactory factory = new TestContainerConnectionDetailsFactory( + List.of("notmyname", "myname")); + ConnectionDetails connectionDetails = getConnectionDetails(factory, this.source); + assertThat(connectionDetails).isNotNull(); + } + @Test void getConnectionDetailsWhenTypesMatchAndNameRestrictionDoesNotMatchReturnsNull() { TestContainerConnectionDetailsFactory factory = new TestContainerConnectionDetailsFactory("notmyname"); @@ -90,6 +101,14 @@ class ContainerConnectionDetailsFactoryTests { assertThat(connectionDetails).isNull(); } + @Test + void getConnectionDetailsWhenTypesMatchAndNameRestrictionsDoNotMatchReturnsNull() { + TestContainerConnectionDetailsFactory factory = new TestContainerConnectionDetailsFactory( + List.of("notmyname", "alsonotmyname")); + ConnectionDetails connectionDetails = getConnectionDetails(factory, this.source); + assertThat(connectionDetails).isNull(); + } + @Test void getConnectionDetailsWhenContainerTypeDoesNotMatchReturnsNull() { ElasticsearchContainer container = mock(ElasticsearchContainer.class); @@ -126,6 +145,18 @@ class ContainerConnectionDetailsFactoryTests { then(context).should().publishEvent(any(BeforeTestcontainerUsedEvent.class)); } + @Test + void creatingFactoryWithEmptyNamesThrows() { + assertThatIllegalArgumentException() + .isThrownBy(() -> new TestContainerConnectionDetailsFactory(Collections.emptyList())); + } + + @Test + void creatingFactoryWithNullNamesThrows() { + assertThatIllegalArgumentException() + .isThrownBy(() -> new TestContainerConnectionDetailsFactory((List) null)); + } + @SuppressWarnings({ "rawtypes", "unchecked" }) private TestContainerConnectionDetails getConnectionDetails(ConnectionDetailsFactory factory, ContainerConnectionSource source) { @@ -146,6 +177,10 @@ class ContainerConnectionDetailsFactoryTests { super(connectionName); } + TestContainerConnectionDetailsFactory(List connectionNames) { + super(connectionNames); + } + @Override protected JdbcConnectionDetails getContainerConnectionDetails( ContainerConnectionSource> source) {