diff --git a/spring-boot-project/spring-boot-test-autoconfigure/build.gradle b/spring-boot-project/spring-boot-test-autoconfigure/build.gradle index 8e0df5f1b10..d9cb04e942e 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/build.gradle +++ b/spring-boot-project/spring-boot-test-autoconfigure/build.gradle @@ -53,7 +53,6 @@ dependencies { testImplementation("com.fasterxml.jackson.module:jackson-module-parameter-names") testImplementation("com.h2database:h2") testImplementation("com.unboundid:unboundid-ldapsdk") - testImplementation("de.flapdoodle.embed:de.flapdoodle.embed.mongo") testImplementation("io.lettuce:lettuce-core") testImplementation("io.projectreactor:reactor-core") testImplementation("io.projectreactor:reactor-test") @@ -76,6 +75,7 @@ dependencies { testImplementation("org.springframework.hateoas:spring-hateoas") testImplementation("org.springframework.plugin:spring-plugin-core") testImplementation("org.testcontainers:junit-jupiter") + testImplementation("org.testcontainers:mongodb") testImplementation("org.testcontainers:neo4j") testImplementation("org.testcontainers:testcontainers") diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/DataMongoTestIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/DataMongoTestIntegrationTests.java index dbf2152c7ea..3e2af399898 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/DataMongoTestIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/DataMongoTestIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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. @@ -16,12 +16,19 @@ package org.springframework.boot.test.autoconfigure.data.mongo; +import java.time.Duration; + import org.junit.jupiter.api.Test; +import org.testcontainers.containers.MongoDBContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; @@ -32,8 +39,13 @@ import static org.assertj.core.api.Assertions.assertThatExceptionOfType; * @author Michael Simons */ @DataMongoTest +@Testcontainers(disabledWithoutDocker = true) class DataMongoTestIntegrationTests { + @Container + static final MongoDBContainer mongoDB = new MongoDBContainer("mongo:4.0.10").withStartupAttempts(5) + .withStartupTimeout(Duration.ofMinutes(5)); + @Autowired private MongoTemplate mongoTemplate; @@ -58,4 +70,9 @@ class DataMongoTestIntegrationTests { .isThrownBy(() -> this.applicationContext.getBean(ExampleService.class)); } + @DynamicPropertySource + static void mongoProperties(DynamicPropertyRegistry registry) { + registry.add("spring.data.mongodb.uri", mongoDB::getReplicaSetUrl); + } + } diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/DataMongoTestReactiveIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/DataMongoTestReactiveIntegrationTests.java index 3b941f5c8bc..b6b89249a50 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/DataMongoTestReactiveIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/DataMongoTestReactiveIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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. @@ -19,9 +19,16 @@ package org.springframework.boot.test.autoconfigure.data.mongo; import java.time.Duration; import org.junit.jupiter.api.Test; +import org.testcontainers.containers.MongoDBContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.util.TestPropertyValues; +import org.springframework.context.ApplicationContextInitializer; +import org.springframework.context.ConfigurableApplicationContext; import org.springframework.data.mongodb.core.ReactiveMongoTemplate; +import org.springframework.test.context.ContextConfiguration; import static org.assertj.core.api.Assertions.assertThat; @@ -31,8 +38,14 @@ import static org.assertj.core.api.Assertions.assertThat; * @author Stephane Nicoll */ @DataMongoTest +@Testcontainers(disabledWithoutDocker = true) +@ContextConfiguration(initializers = DataMongoTestReactiveIntegrationTests.Initializer.class) class DataMongoTestReactiveIntegrationTests { + @Container + static final MongoDBContainer mongoDB = new MongoDBContainer("mongo:4.0.10").withStartupAttempts(5) + .withStartupTimeout(Duration.ofMinutes(5)); + @Autowired private ReactiveMongoTemplate mongoTemplate; @@ -48,4 +61,14 @@ class DataMongoTestReactiveIntegrationTests { assertThat(this.mongoTemplate.collectionExists("exampleDocuments").block(Duration.ofSeconds(30))).isTrue(); } + static class Initializer implements ApplicationContextInitializer { + + @Override + public void initialize(ConfigurableApplicationContext configurableApplicationContext) { + TestPropertyValues.of("spring.data.mongodb.uri=" + mongoDB.getReplicaSetUrl()) + .applyTo(configurableApplicationContext.getEnvironment()); + } + + } + } diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/DataMongoTestWithIncludeFilterIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/DataMongoTestWithIncludeFilterIntegrationTests.java index 15d9d7e5b82..3d59910eabb 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/DataMongoTestWithIncludeFilterIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/DataMongoTestWithIncludeFilterIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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. @@ -16,11 +16,20 @@ package org.springframework.boot.test.autoconfigure.data.mongo; +import java.time.Duration; + import org.junit.jupiter.api.Test; +import org.testcontainers.containers.MongoDBContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.util.TestPropertyValues; +import org.springframework.context.ApplicationContextInitializer; +import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.stereotype.Service; +import org.springframework.test.context.ContextConfiguration; import static org.assertj.core.api.Assertions.assertThat; @@ -30,8 +39,14 @@ import static org.assertj.core.api.Assertions.assertThat; * @author Michael Simons */ @DataMongoTest(includeFilters = @Filter(Service.class)) +@Testcontainers(disabledWithoutDocker = true) +@ContextConfiguration(initializers = DataMongoTestWithIncludeFilterIntegrationTests.Initializer.class) class DataMongoTestWithIncludeFilterIntegrationTests { + @Container + static final MongoDBContainer mongoDB = new MongoDBContainer("mongo:4.0.10").withStartupAttempts(5) + .withStartupTimeout(Duration.ofMinutes(5)); + @Autowired private ExampleService service; @@ -40,4 +55,14 @@ class DataMongoTestWithIncludeFilterIntegrationTests { assertThat(this.service.hasCollection("foobar")).isFalse(); } + static class Initializer implements ApplicationContextInitializer { + + @Override + public void initialize(ConfigurableApplicationContext configurableApplicationContext) { + TestPropertyValues.of("spring.data.mongodb.uri=" + mongoDB.getReplicaSetUrl()) + .applyTo(configurableApplicationContext.getEnvironment()); + } + + } + } diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/TransactionalDataMongoTestIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/TransactionalDataMongoTestIntegrationTests.java index da3a11dc43e..bb57a8a9dc2 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/TransactionalDataMongoTestIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/mongo/TransactionalDataMongoTestIntegrationTests.java @@ -16,34 +16,22 @@ package org.springframework.boot.test.autoconfigure.data.mongo; -import java.io.IOException; import java.time.Duration; -import java.util.List; -import com.mongodb.BasicDBList; -import com.mongodb.ServerAddress; -import com.mongodb.client.ClientSession; -import com.mongodb.client.MongoClient; -import com.mongodb.client.MongoDatabase; -import com.mongodb.connection.ServerDescription; -import de.flapdoodle.embed.mongo.config.IMongoCmdOptions; -import de.flapdoodle.embed.mongo.config.IMongodConfig; -import de.flapdoodle.embed.mongo.config.MongoCmdOptionsBuilder; -import de.flapdoodle.embed.mongo.config.MongodConfigBuilder; -import de.flapdoodle.embed.mongo.config.Storage; -import de.flapdoodle.embed.mongo.distribution.Version; -import org.awaitility.Awaitility; -import org.bson.Document; import org.junit.jupiter.api.Test; +import org.testcontainers.containers.MongoDBContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoProperties; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.data.mongodb.MongoDatabaseFactory; import org.springframework.data.mongodb.MongoTransactionManager; import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; import org.springframework.transaction.annotation.Transactional; import static org.assertj.core.api.Assertions.assertThat; @@ -55,8 +43,13 @@ import static org.assertj.core.api.Assertions.assertThat; */ @DataMongoTest @Transactional +@Testcontainers(disabledWithoutDocker = true) class TransactionalDataMongoTestIntegrationTests { + @Container + static final MongoDBContainer mongoDB = new MongoDBContainer("mongo:4.0.10").withStartupAttempts(5) + .withStartupTimeout(Duration.ofMinutes(5)); + @Autowired private ExampleRepository exampleRepository; @@ -68,6 +61,11 @@ class TransactionalDataMongoTestIntegrationTests { assertThat(exampleDocument.getId()).isNotNull(); } + @DynamicPropertySource + static void mongoProperties(DynamicPropertyRegistry registry) { + registry.add("spring.data.mongodb.uri", mongoDB::getReplicaSetUrl); + } + @TestConfiguration(proxyBeanMethods = false) static class TransactionManagerConfiguration { @@ -79,53 +77,23 @@ class TransactionalDataMongoTestIntegrationTests { } @TestConfiguration(proxyBeanMethods = false) - static class MongoCustomizationConfiguration { - - private static final String REPLICA_SET_NAME = "rs1"; + static class MongoInitializationConfiguration { @Bean - IMongodConfig embeddedMongoConfiguration(EmbeddedMongoProperties embeddedProperties) throws IOException { - IMongoCmdOptions cmdOptions = new MongoCmdOptionsBuilder().useNoJournal(false).build(); - return new MongodConfigBuilder().version(Version.Main.PRODUCTION) - .replication(new Storage(null, REPLICA_SET_NAME, 0)).cmdOptions(cmdOptions) - .stopTimeoutInMillis(60000).build(); - } - - @Bean - MongoInitializer mongoInitializer(MongoClient client, MongoTemplate template) { - return new MongoInitializer(client, template); + MongoInitializer mongoInitializer(MongoTemplate template) { + return new MongoInitializer(template); } static class MongoInitializer implements InitializingBean { - private final MongoClient client; - private final MongoTemplate template; - MongoInitializer(MongoClient client, MongoTemplate template) { - this.client = client; + MongoInitializer(MongoTemplate template) { this.template = template; } @Override public void afterPropertiesSet() throws Exception { - List servers = this.client.getClusterDescription().getServerDescriptions(); - assertThat(servers).hasSize(1); - ServerAddress address = servers.get(0).getAddress(); - BasicDBList members = new BasicDBList(); - members.add(new Document("_id", 0).append("host", address.getHost() + ":" + address.getPort())); - Document config = new Document("_id", REPLICA_SET_NAME); - config.put("members", members); - MongoDatabase admin = this.client.getDatabase("admin"); - admin.runCommand(new Document("replSetInitiate", config)); - Awaitility.await().atMost(Duration.ofMinutes(1)).until(() -> { - try (ClientSession session = this.client.startSession()) { - return true; - } - catch (Exception ex) { - return false; - } - }); this.template.createCollection("exampleDocuments"); }