Skip to content

Commit 7ef121e

Browse files
committed
Replace Flapdoodle with Testcontainers for MongoDB support.
For more details on this usage of Testcontainers, see https://bsideup.github.io/posts/local_development_with_testcontainers/ Related issues: spring-projects/spring-boot#30863
1 parent aaed973 commit 7ef121e

File tree

10 files changed

+89
-65
lines changed

10 files changed

+89
-65
lines changed

spring-session-samples/spring-session-sample-boot-mongodb-reactive/spring-session-sample-boot-mongodb-reactive.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ dependencies {
55
implementation "org.springframework.boot:spring-boot-starter-webflux"
66
implementation "org.springframework.boot:spring-boot-starter-thymeleaf"
77
implementation "org.springframework.boot:spring-boot-starter-data-mongodb-reactive"
8-
implementation "de.flapdoodle.embed:de.flapdoodle.embed.mongo"
8+
implementation "org.testcontainers:mongodb"
99

1010
testImplementation "org.springframework.boot:spring-boot-starter-test"
1111
testImplementation "org.seleniumhq.selenium:htmlunit-driver"

spring-session-samples/spring-session-sample-boot-mongodb-reactive/src/main/java/org/springframework/session/mongodb/examples/SpringSessionMongoReactiveApplication.java

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,16 @@
1818

1919
import org.springframework.boot.SpringApplication;
2020
import org.springframework.boot.autoconfigure.SpringBootApplication;
21+
import org.springframework.context.ApplicationContextInitializer;
22+
import org.springframework.context.ConfigurableApplicationContext;
23+
import org.springframework.core.env.ConfigurableEnvironment;
24+
import org.springframework.core.env.MapPropertySource;
2125
import org.springframework.session.data.mongo.config.annotation.web.reactive.EnableMongoWebSession;
26+
import org.testcontainers.containers.MongoDBContainer;
27+
import org.testcontainers.utility.DockerImageName;
28+
29+
import java.util.HashMap;
30+
import java.util.Map;
2231

2332
/**
2433
* Pure Spring-based application (using Spring Boot for dependency management), hence no
@@ -31,8 +40,35 @@
3140
@EnableMongoWebSession
3241
public class SpringSessionMongoReactiveApplication {
3342

34-
public static void main(String[] args) {
35-
SpringApplication.run(SpringSessionMongoReactiveApplication.class);
43+
/**
44+
* Use Testcontainers to managed MongoDB through Docker.
45+
* <p>
46+
* @see https://bsideup.github.io/posts/local_development_with_testcontainers/
47+
*/
48+
static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
49+
50+
static MongoDBContainer mongo = new MongoDBContainer(DockerImageName.parse("mongo:5.0"));
51+
52+
public static Map<String, String> getProperties() {
53+
mongo.start();
54+
55+
HashMap<String, String> properties = new HashMap<>();
56+
properties.put("spring.data.mongodb.host", mongo.getHost());
57+
properties.put("spring.data.mongodb.port", mongo.getFirstMappedPort() + "");
58+
return properties;
59+
}
60+
61+
@Override
62+
public void initialize(ConfigurableApplicationContext context) {
63+
ConfigurableEnvironment env = context.getEnvironment();
64+
env.getPropertySources().addFirst(new MapPropertySource("testcontainers", (Map) getProperties()));
65+
}
3666
}
3767

68+
69+
public static void main(String[] args) {
70+
SpringApplication application = new SpringApplication(SpringSessionMongoReactiveApplication.class);
71+
application.addInitializers(new Initializer());
72+
application.run(args);
73+
}
3874
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
logging.level.org.springframework.data.mongodb=DEBUG
2+
logging.level.org.springframework.session=DEBUG

spring-session-samples/spring-session-sample-boot-mongodb-reactive/src/main/resources/application.yml

Lines changed: 0 additions & 8 deletions
This file was deleted.

spring-session-samples/spring-session-sample-boot-mongodb-reactive/src/test/java/org/springframework/session/mongodb/examples/AttributeTests.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,21 @@
1616

1717
package org.springframework.session.mongodb.examples;
1818

19-
import java.util.List;
20-
2119
import org.junit.jupiter.api.AfterEach;
2220
import org.junit.jupiter.api.BeforeEach;
2321
import org.junit.jupiter.api.Test;
2422
import org.junit.jupiter.api.extension.ExtendWith;
2523
import org.openqa.selenium.WebDriver;
2624
import org.openqa.selenium.htmlunit.HtmlUnitDriver;
27-
2825
import org.springframework.boot.test.context.SpringBootTest;
2926
import org.springframework.boot.web.server.LocalServerPort;
3027
import org.springframework.session.mongodb.examples.pages.HomePage;
3128
import org.springframework.session.mongodb.examples.pages.HomePage.Attribute;
29+
import org.springframework.test.context.ContextConfiguration;
3230
import org.springframework.test.context.junit.jupiter.SpringExtension;
3331

32+
import java.util.List;
33+
3434
import static org.assertj.core.api.Assertions.assertThat;
3535

3636
/**
@@ -39,6 +39,7 @@
3939
*/
4040
@ExtendWith(SpringExtension.class)
4141
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
42+
@ContextConfiguration(initializers = SpringSessionMongoReactiveApplication.Initializer.class)
4243
public class AttributeTests {
4344

4445
@LocalServerPort

spring-session-samples/spring-session-sample-boot-mongodb-traditional/spring-session-sample-boot-mongodb-traditional.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ dependencies {
88
implementation "org.thymeleaf.extras:thymeleaf-extras-springsecurity5"
99
implementation "org.springframework.boot:spring-boot-starter-data-mongodb"
1010
implementation "org.springframework.boot:spring-boot-starter-security"
11-
implementation "de.flapdoodle.embed:de.flapdoodle.embed.mongo"
11+
implementation "org.testcontainers:mongodb"
12+
1213

1314
testImplementation "org.springframework.boot:spring-boot-starter-test"
1415
testImplementation "org.seleniumhq.selenium:htmlunit-driver"

spring-session-samples/spring-session-sample-boot-mongodb-traditional/src/main/java/org/springframework/session/mongodb/examples/EmbeddedMongoPortLogger.java

Lines changed: 0 additions & 46 deletions
This file was deleted.

spring-session-samples/spring-session-sample-boot-mongodb-traditional/src/main/java/org/springframework/session/mongodb/examples/SpringSessionMongoTraditionalBoot.java

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,50 @@
1818

1919
import org.springframework.boot.SpringApplication;
2020
import org.springframework.boot.autoconfigure.SpringBootApplication;
21+
import org.springframework.context.ApplicationContextInitializer;
22+
import org.springframework.context.ConfigurableApplicationContext;
23+
import org.springframework.core.env.ConfigurableEnvironment;
24+
import org.springframework.core.env.MapPropertySource;
25+
import org.testcontainers.containers.MongoDBContainer;
26+
import org.testcontainers.utility.DockerImageName;
27+
28+
import java.util.HashMap;
29+
import java.util.Map;
2130

2231
/**
2332
* @author Rob Winch
2433
*/
2534
@SpringBootApplication
2635
public class SpringSessionMongoTraditionalBoot {
2736

28-
public static void main(String[] args) {
29-
SpringApplication.run(SpringSessionMongoTraditionalBoot.class, args);
37+
/**
38+
* Use Testcontainers to managed MongoDB through Docker.
39+
* <p>
40+
* @see https://bsideup.github.io/posts/local_development_with_testcontainers/
41+
*/
42+
static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
43+
44+
static MongoDBContainer mongo = new MongoDBContainer(DockerImageName.parse("mongo:5.0"));
45+
46+
public static Map<String, String> getProperties() {
47+
mongo.start();
48+
49+
HashMap<String, String> properties = new HashMap<>();
50+
properties.put("spring.data.mongodb.host", mongo.getHost());
51+
properties.put("spring.data.mongodb.port", mongo.getFirstMappedPort() + "");
52+
return properties;
53+
}
54+
55+
@Override
56+
public void initialize(ConfigurableApplicationContext context) {
57+
ConfigurableEnvironment env = context.getEnvironment();
58+
env.getPropertySources().addFirst(new MapPropertySource("testcontainers", (Map) getProperties()));
59+
}
3060
}
3161

62+
public static void main(String[] args) {
63+
SpringApplication application = new SpringApplication(SpringSessionMongoTraditionalBoot.class);
64+
application.addInitializers(new Initializer());
65+
application.run(args);
66+
}
3267
}
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
spring.thymeleaf.cache=false
22
spring.template.cache=false
3-
spring.data.mongodb.port=0
4-
spring.mongodb.embedded.version=3.4.3
3+
4+
logging.level.org.springframework.data.mongodb=DEBUG
5+
logging.level.org.springframework.session=DEBUG

spring-session-samples/spring-session-sample-boot-mongodb-traditional/src/test/java/org/springframework/session/mongodb/examples/BootTests.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
3434
import org.springframework.session.mongodb.examples.pages.HomePage;
3535
import org.springframework.session.mongodb.examples.pages.LoginPage;
36+
import org.springframework.test.context.ContextConfiguration;
3637
import org.springframework.test.context.junit.jupiter.SpringExtension;
3738
import org.springframework.test.web.servlet.MockMvc;
3839
import org.springframework.test.web.servlet.htmlunit.webdriver.MockMvcHtmlUnitDriverBuilder;
@@ -45,6 +46,7 @@
4546
@ExtendWith(SpringExtension.class)
4647
@AutoConfigureMockMvc
4748
@SpringBootTest(webEnvironment = WebEnvironment.MOCK)
49+
@ContextConfiguration(initializers = SpringSessionMongoTraditionalBoot.Initializer.class)
4850
public class BootTests {
4951

5052
@Autowired

0 commit comments

Comments
 (0)