From f8dbcef977c8151e7d202c75390c841e4050fefe Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Wed, 2 Jul 2025 15:39:12 +0100 Subject: [PATCH] Polish "Add @ServiceConnection support for MongoDBAtlasLocalContainer" See gh-45310 --- .../pages/testing/testcontainers.adoc | 2 +- .../spring-boot-mongodb/build.gradle | 2 + ...nectionDetailsFactoryIntegrationTests.java | 57 +++++++++++++++++++ ...ongoContainerConnectionDetailsFactory.java | 3 +- ...calContainerConnectionDetailsFactory.java} | 4 +- ...oDbContainerConnectionDetailsFactory.java} | 5 +- .../main/resources/META-INF/spring.factories | 4 +- ...ntainerConnectionDetailsFactoryTests.java} | 4 +- ...ontainerConnectionDetailsFactoryTests.java | 41 ------------- .../boot/testsupport/container/TestImage.java | 8 +++ 10 files changed, 78 insertions(+), 52 deletions(-) create mode 100644 spring-boot-project/spring-boot-mongodb/src/dockerTest/java/org/springframework/boot/mongodb/testcontainers/MongoDbAtlasLocalContainerConnectionDetailsFactoryIntegrationTests.java rename spring-boot-project/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/testcontainers/{MongoAtlasContainerConnectionDetailsFactory.java => MongoDbAtlasLocalContainerConnectionDetailsFactory.java} (92%) rename spring-boot-project/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/testcontainers/{MongoContainerConnectionDetailsFactory.java => MongoDbContainerConnectionDetailsFactory.java} (91%) rename spring-boot-project/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/testcontainers/{MongoContainerConnectionDetailsFactoryTests.java => AbstractMongoContainerConnectionDetailsFactoryTests.java} (91%) delete mode 100644 spring-boot-project/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/testcontainers/MongoAtlasContainerConnectionDetailsFactoryTests.java diff --git a/spring-boot-project/spring-boot-docs/src/docs/antora/modules/reference/pages/testing/testcontainers.adoc b/spring-boot-project/spring-boot-docs/src/docs/antora/modules/reference/pages/testing/testcontainers.adoc index 6cae636a789..aeab8732484 100644 --- a/spring-boot-project/spring-boot-docs/src/docs/antora/modules/reference/pages/testing/testcontainers.adoc +++ b/spring-boot-project/spring-boot-docs/src/docs/antora/modules/reference/pages/testing/testcontainers.adoc @@ -150,7 +150,7 @@ The following service connection factories are provided in the `spring-boot-test | Containers of type javadoc:{url-testcontainers-jdbc-javadoc}/org.testcontainers.containers.JdbcDatabaseContainer[] | javadoc:org.springframework.boot.autoconfigure.mongo.MongoConnectionDetails[] -| Containers of type javadoc:{url-testcontainers-mongodb-javadoc}/org.testcontainers.containers.MongoDBContainer[] +| Containers of type javadoc:{url-testcontainers-mongodb-javadoc}/org.testcontainers.containers.MongoDBContainer[] or javadoc:{url-testcontainers-mongodb-javadoc}/org.testcontainers.mongodb.MongoDBAtlasLocalContainer[] | javadoc:org.springframework.boot.neo4j.autoconfigure.Neo4jConnectionDetails[] | Containers of type javadoc:{url-testcontainers-neo4j-javadoc}/org.testcontainers.containers.Neo4jContainer[] diff --git a/spring-boot-project/spring-boot-mongodb/build.gradle b/spring-boot-project/spring-boot-mongodb/build.gradle index b46001bc317..1c9af58f379 100644 --- a/spring-boot-project/spring-boot-mongodb/build.gradle +++ b/spring-boot-project/spring-boot-mongodb/build.gradle @@ -42,6 +42,8 @@ dependencies { dockerTestImplementation(project(":spring-boot-project:spring-boot-test")) dockerTestImplementation(project(":spring-boot-project:spring-boot-tools:spring-boot-test-support-docker")) dockerTestImplementation(testFixtures(project(":spring-boot-project:spring-boot-docker-compose"))) + dockerTestImplementation("org.testcontainers:junit-jupiter") + dockerTestImplementation("org.mongodb:mongodb-driver-sync") testImplementation(project(":spring-boot-project:spring-boot-test")) testImplementation(project(":spring-boot-project:spring-boot-tools:spring-boot-test-support")) diff --git a/spring-boot-project/spring-boot-mongodb/src/dockerTest/java/org/springframework/boot/mongodb/testcontainers/MongoDbAtlasLocalContainerConnectionDetailsFactoryIntegrationTests.java b/spring-boot-project/spring-boot-mongodb/src/dockerTest/java/org/springframework/boot/mongodb/testcontainers/MongoDbAtlasLocalContainerConnectionDetailsFactoryIntegrationTests.java new file mode 100644 index 00000000000..7f96cfab8ea --- /dev/null +++ b/spring-boot-project/spring-boot-mongodb/src/dockerTest/java/org/springframework/boot/mongodb/testcontainers/MongoDbAtlasLocalContainerConnectionDetailsFactoryIntegrationTests.java @@ -0,0 +1,57 @@ +/* + * Copyright 2012-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.mongodb.testcontainers; + +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoClients; +import org.junit.jupiter.api.Test; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mongodb.MongoDBAtlasLocalContainer; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.mongodb.autoconfigure.MongoConnectionDetails; +import org.springframework.boot.testcontainers.service.connection.ServiceConnection; +import org.springframework.boot.testsupport.container.TestImage; +import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Integration tests for {@link MongoDbAtlasLocalContainerConnectionDetailsFactory}. + * + * @author Andy Wilkinson + */ +@SpringJUnitConfig +@Testcontainers(disabledWithoutDocker = true) +class MongoDbAtlasLocalContainerConnectionDetailsFactoryIntegrationTests { + + @Container + @ServiceConnection + static final MongoDBAtlasLocalContainer mongoDb = TestImage.container(MongoDBAtlasLocalContainer.class); + + @Autowired(required = false) + private MongoConnectionDetails connectionDetails; + + @Test + void connectionCanBeMadeToContainer() { + assertThat(this.connectionDetails).isNotNull(); + MongoClient client = MongoClients.create(this.connectionDetails.getConnectionString()); + assertThat(client.listDatabaseNames()).containsExactly("admin", "config", "local"); + } + +} diff --git a/spring-boot-project/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/testcontainers/AbstractMongoContainerConnectionDetailsFactory.java b/spring-boot-project/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/testcontainers/AbstractMongoContainerConnectionDetailsFactory.java index 37fa72dabcb..b5883a06c54 100644 --- a/spring-boot-project/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/testcontainers/AbstractMongoContainerConnectionDetailsFactory.java +++ b/spring-boot-project/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/testcontainers/AbstractMongoContainerConnectionDetailsFactory.java @@ -30,8 +30,9 @@ import org.springframework.boot.testcontainers.service.connection.ServiceConnect /** * Abstract {@link ContainerConnectionDetailsFactory} to create * {@link MongoConnectionDetails} from a - * {@link ServiceConnection @ServiceConnection}-annotated {@link T}. + * {@link ServiceConnection @ServiceConnection}-annotated MongoDB container. * + * @param type of MongoDB container supported by the factory * @author Moritz Halbritter * @author Andy Wilkinson * @author Phillip Webb diff --git a/spring-boot-project/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/testcontainers/MongoAtlasContainerConnectionDetailsFactory.java b/spring-boot-project/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/testcontainers/MongoDbAtlasLocalContainerConnectionDetailsFactory.java similarity index 92% rename from spring-boot-project/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/testcontainers/MongoAtlasContainerConnectionDetailsFactory.java rename to spring-boot-project/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/testcontainers/MongoDbAtlasLocalContainerConnectionDetailsFactory.java index 0693cda0e46..b2b965b243a 100644 --- a/spring-boot-project/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/testcontainers/MongoAtlasContainerConnectionDetailsFactory.java +++ b/spring-boot-project/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/testcontainers/MongoDbAtlasLocalContainerConnectionDetailsFactory.java @@ -29,10 +29,10 @@ import org.springframework.boot.testcontainers.service.connection.ServiceConnect * * @author Wouter Blancquaert */ -class MongoAtlasContainerConnectionDetailsFactory +class MongoDbAtlasLocalContainerConnectionDetailsFactory extends AbstractMongoContainerConnectionDetailsFactory { - MongoAtlasContainerConnectionDetailsFactory() { + MongoDbAtlasLocalContainerConnectionDetailsFactory() { super(MongoDBAtlasLocalContainer::getDatabaseConnectionString); } diff --git a/spring-boot-project/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/testcontainers/MongoContainerConnectionDetailsFactory.java b/spring-boot-project/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/testcontainers/MongoDbContainerConnectionDetailsFactory.java similarity index 91% rename from spring-boot-project/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/testcontainers/MongoContainerConnectionDetailsFactory.java rename to spring-boot-project/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/testcontainers/MongoDbContainerConnectionDetailsFactory.java index 1cc6e244892..958676e2d60 100644 --- a/spring-boot-project/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/testcontainers/MongoContainerConnectionDetailsFactory.java +++ b/spring-boot-project/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/testcontainers/MongoDbContainerConnectionDetailsFactory.java @@ -19,7 +19,6 @@ package org.springframework.boot.mongodb.testcontainers; import org.testcontainers.containers.MongoDBContainer; import org.springframework.boot.mongodb.autoconfigure.MongoConnectionDetails; -import org.springframework.boot.ssl.SslBundle; import org.springframework.boot.testcontainers.service.connection.ContainerConnectionDetailsFactory; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; @@ -31,10 +30,10 @@ import org.springframework.boot.testcontainers.service.connection.ServiceConnect * @author Andy Wilkinson * @author Phillip Webb */ -class MongoContainerConnectionDetailsFactory +class MongoDbContainerConnectionDetailsFactory extends AbstractMongoContainerConnectionDetailsFactory { - MongoContainerConnectionDetailsFactory() { + MongoDbContainerConnectionDetailsFactory() { super(MongoDBContainer::getReplicaSetUrl); } diff --git a/spring-boot-project/spring-boot-mongodb/src/main/resources/META-INF/spring.factories b/spring-boot-project/spring-boot-mongodb/src/main/resources/META-INF/spring.factories index 31ca13178d2..189e62c27c3 100644 --- a/spring-boot-project/spring-boot-mongodb/src/main/resources/META-INF/spring.factories +++ b/spring-boot-project/spring-boot-mongodb/src/main/resources/META-INF/spring.factories @@ -1,5 +1,5 @@ # Connection Details Factories org.springframework.boot.autoconfigure.service.connection.ConnectionDetailsFactory=\ org.springframework.boot.mongodb.docker.compose.MongoDockerComposeConnectionDetailsFactory,\ -org.springframework.boot.mongodb.testcontainers.MongoAtlasContainerConnectionDetailsFactory,\ -org.springframework.boot.mongodb.testcontainers.MongoContainerConnectionDetailsFactory +org.springframework.boot.mongodb.testcontainers.MongoDbAtlasLocalContainerConnectionDetailsFactory,\ +org.springframework.boot.mongodb.testcontainers.MongoDbContainerConnectionDetailsFactory diff --git a/spring-boot-project/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/testcontainers/MongoContainerConnectionDetailsFactoryTests.java b/spring-boot-project/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/testcontainers/AbstractMongoContainerConnectionDetailsFactoryTests.java similarity index 91% rename from spring-boot-project/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/testcontainers/MongoContainerConnectionDetailsFactoryTests.java rename to spring-boot-project/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/testcontainers/AbstractMongoContainerConnectionDetailsFactoryTests.java index ed161ac5940..9fb2438683f 100644 --- a/spring-boot-project/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/testcontainers/MongoContainerConnectionDetailsFactoryTests.java +++ b/spring-boot-project/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/testcontainers/AbstractMongoContainerConnectionDetailsFactoryTests.java @@ -26,11 +26,11 @@ import org.springframework.boot.testcontainers.service.connection.ContainerConne import static org.assertj.core.api.Assertions.assertThat; /** - * Tests for {@link MongoContainerConnectionDetailsFactory}. + * Tests for {@link AbstractMongoContainerConnectionDetailsFactory}. * * @author Moritz Halbritter */ -class MongoContainerConnectionDetailsFactoryTests { +class AbstractMongoContainerConnectionDetailsFactoryTests { @Test void shouldRegisterHints() { diff --git a/spring-boot-project/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/testcontainers/MongoAtlasContainerConnectionDetailsFactoryTests.java b/spring-boot-project/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/testcontainers/MongoAtlasContainerConnectionDetailsFactoryTests.java deleted file mode 100644 index 47a23010e13..00000000000 --- a/spring-boot-project/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/testcontainers/MongoAtlasContainerConnectionDetailsFactoryTests.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2012-2025 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.boot.testcontainers.service.connection.mongo; - -import com.mongodb.ConnectionString; -import org.junit.jupiter.api.Test; - -import org.springframework.aot.hint.RuntimeHints; -import org.springframework.aot.hint.predicate.RuntimeHintsPredicates; -import org.springframework.boot.testcontainers.service.connection.ContainerConnectionDetailsFactoryHints; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Tests for {@link MongoAtlasContainerConnectionDetailsFactoryTests}. - * - * @author Wouter Blancquaert - */ -class MongoAtlasContainerConnectionDetailsFactoryTests { - - @Test - void shouldRegisterHints() { - RuntimeHints hints = ContainerConnectionDetailsFactoryHints.getRegisteredHints(getClass().getClassLoader()); - assertThat(RuntimeHintsPredicates.reflection().onType(ConnectionString.class)).accepts(hints); - } - -} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support-docker/src/main/java/org/springframework/boot/testsupport/container/TestImage.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support-docker/src/main/java/org/springframework/boot/testsupport/container/TestImage.java index cc670d59329..dc10652fc7a 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-test-support-docker/src/main/java/org/springframework/boot/testsupport/container/TestImage.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support-docker/src/main/java/org/springframework/boot/testsupport/container/TestImage.java @@ -40,6 +40,7 @@ import org.testcontainers.elasticsearch.ElasticsearchContainer; import org.testcontainers.grafana.LgtmStackContainer; import org.testcontainers.kafka.ConfluentKafkaContainer; import org.testcontainers.ldap.LLdapContainer; +import org.testcontainers.mongodb.MongoDBAtlasLocalContainer; import org.testcontainers.redpanda.RedpandaContainer; import org.testcontainers.utility.DockerImageName; @@ -157,6 +158,13 @@ public enum TestImage { (container) -> ((MongoDBContainer) container).withStartupAttempts(5) .withStartupTimeout(Duration.ofMinutes(5))), + /** + * A container image suitable for testing MongoDB Atlas. + */ + MONGODB_ATLAS("mongodb/mongodb-atlas-local", "8.0.4", () -> MongoDBAtlasLocalContainer.class, + (container) -> ((MongoDBAtlasLocalContainer) container).withStartupAttempts(5) + .withStartupTimeout(Duration.ofMinutes(5))), + /** * A container image suitable for testing MySQL. */