diff --git a/testing-modules/pom.xml b/testing-modules/pom.xml
index b467b3c503..f1d30cd7a1 100644
--- a/testing-modules/pom.xml
+++ b/testing-modules/pom.xml
@@ -31,7 +31,8 @@
rest-assured
rest-testing
selenium-junit-testng
- spring-testing
+ spring-testing
+ spring-testing-2
test-containers
testing-assertions
testng
diff --git a/testing-modules/spring-testing-2/.gitignore b/testing-modules/spring-testing-2/.gitignore
new file mode 100644
index 0000000000..ffc5bf3bad
--- /dev/null
+++ b/testing-modules/spring-testing-2/.gitignore
@@ -0,0 +1,3 @@
+.idea/**
+target/**
+*.iml
\ No newline at end of file
diff --git a/testing-modules/spring-testing-2/README.md b/testing-modules/spring-testing-2/README.md
new file mode 100644
index 0000000000..729105e3fd
--- /dev/null
+++ b/testing-modules/spring-testing-2/README.md
@@ -0,0 +1 @@
+## Relevant Articles:
diff --git a/testing-modules/spring-testing-2/pom.xml b/testing-modules/spring-testing-2/pom.xml
new file mode 100644
index 0000000000..c7ca2804fb
--- /dev/null
+++ b/testing-modules/spring-testing-2/pom.xml
@@ -0,0 +1,57 @@
+
+
+
+ 4.0.0
+ spring-testing-2
+ 0.1-SNAPSHOT
+ spring-testing-2
+
+
+ com.baeldung
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../../parent-boot-2
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+
+ org.postgresql
+ postgresql
+ runtime
+
+
+
+
+ org.testcontainers
+ postgresql
+ ${testcontainers.version}
+ test
+
+
+ org.testcontainers
+ junit-jupiter
+ ${testcontainers.version}
+ test
+
+
+
+
+
+ 2.1.9.RELEASE
+ 2.1.9.RELEASE
+ 1.12.2
+
+
\ No newline at end of file
diff --git a/testing-modules/spring-testing-2/src/main/java/com/baeldung/dynamicproperties/Article.java b/testing-modules/spring-testing-2/src/main/java/com/baeldung/dynamicproperties/Article.java
new file mode 100644
index 0000000000..6b6bfb7bd6
--- /dev/null
+++ b/testing-modules/spring-testing-2/src/main/java/com/baeldung/dynamicproperties/Article.java
@@ -0,0 +1,45 @@
+package com.baeldung.dynamicproperties;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+@Entity
+@Table(name = "articles")
+public class Article {
+
+ @Id
+ @GeneratedValue(strategy = IDENTITY)
+ private Long id;
+
+ private String title;
+
+ private String content;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+}
diff --git a/testing-modules/spring-testing-2/src/main/java/com/baeldung/dynamicproperties/ArticleRepository.java b/testing-modules/spring-testing-2/src/main/java/com/baeldung/dynamicproperties/ArticleRepository.java
new file mode 100644
index 0000000000..3f3731f6dc
--- /dev/null
+++ b/testing-modules/spring-testing-2/src/main/java/com/baeldung/dynamicproperties/ArticleRepository.java
@@ -0,0 +1,6 @@
+package com.baeldung.dynamicproperties;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface ArticleRepository extends JpaRepository {
+}
diff --git a/testing-modules/spring-testing-2/src/main/java/com/baeldung/dynamicproperties/DynamicPropertiesApplication.java b/testing-modules/spring-testing-2/src/main/java/com/baeldung/dynamicproperties/DynamicPropertiesApplication.java
new file mode 100644
index 0000000000..d64bd965fc
--- /dev/null
+++ b/testing-modules/spring-testing-2/src/main/java/com/baeldung/dynamicproperties/DynamicPropertiesApplication.java
@@ -0,0 +1,12 @@
+package com.baeldung.dynamicproperties;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class DynamicPropertiesApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(DynamicPropertiesApplication.class, args);
+ }
+}
diff --git a/testing-modules/spring-testing-2/src/test/java/com/baeldung/dynamicproperties/ArticleLiveTest.java b/testing-modules/spring-testing-2/src/test/java/com/baeldung/dynamicproperties/ArticleLiveTest.java
new file mode 100644
index 0000000000..74c31229bd
--- /dev/null
+++ b/testing-modules/spring-testing-2/src/test/java/com/baeldung/dynamicproperties/ArticleLiveTest.java
@@ -0,0 +1,50 @@
+package com.baeldung.dynamicproperties;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.DynamicPropertyRegistry;
+import org.springframework.test.context.DynamicPropertySource;
+import org.testcontainers.containers.PostgreSQLContainer;
+import org.testcontainers.junit.jupiter.Container;
+import org.testcontainers.junit.jupiter.Testcontainers;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@SpringBootTest
+@Testcontainers
+@ActiveProfiles("pg")
+public class ArticleLiveTest {
+
+ @Container
+ static PostgreSQLContainer> postgres = new PostgreSQLContainer<>("postgres:11")
+ .withDatabaseName("prop")
+ .withUsername("postgres")
+ .withPassword("pass")
+ .withExposedPorts(5432);
+
+ @Autowired
+ private ArticleRepository articleRepository;
+
+ @DynamicPropertySource
+ static void registerPgProperties(DynamicPropertyRegistry registry) {
+ registry.add("spring.datasource.url",
+ () -> String.format("jdbc:postgresql://localhost:%d/prop", postgres.getFirstMappedPort()));
+ registry.add("spring.datasource.username", () -> "postgres");
+ registry.add("spring.datasource.password", () -> "pass");
+ }
+
+ @Test
+ void givenAnArticle_whenPersisted_thenCanBeFoundInTheDb() {
+ Article article = new Article();
+ article.setTitle("A Guide to @DynamicPropertySource in Spring");
+ article.setContent("Today's applications...");
+
+ articleRepository.save(article);
+ Article persisted = articleRepository.findAll().get(0);
+ assertThat(persisted.getId()).isNotNull();
+ assertThat(persisted.getTitle()).isEqualTo("A Guide to @DynamicPropertySource in Spring");
+ assertThat(persisted.getContent()).isEqualTo("Today's applications...");
+ }
+}
diff --git a/testing-modules/spring-testing-2/src/test/java/com/baeldung/dynamicproperties/ArticleTestFixtureLiveTest.java b/testing-modules/spring-testing-2/src/test/java/com/baeldung/dynamicproperties/ArticleTestFixtureLiveTest.java
new file mode 100644
index 0000000000..bb3ad28365
--- /dev/null
+++ b/testing-modules/spring-testing-2/src/test/java/com/baeldung/dynamicproperties/ArticleTestFixtureLiveTest.java
@@ -0,0 +1,31 @@
+package com.baeldung.dynamicproperties;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@SpringBootTest
+@ActiveProfiles("pg")
+@ExtendWith(PostgreSQLExtension.class)
+public class ArticleTestFixtureLiveTest {
+
+ @Autowired
+ private ArticleRepository articleRepository;
+
+ @Test
+ void givenAnArticle_whenPersisted_thenShouldBeAbleToReadIt() {
+ Article article = new Article();
+ article.setTitle("A Guide to @DynamicPropertySource in Spring");
+ article.setContent("Today's applications...");
+
+ articleRepository.save(article);
+ Article persisted = articleRepository.findAll().get(0);
+ assertThat(persisted.getId()).isNotNull();
+ assertThat(persisted.getTitle()).isEqualTo("A Guide to @DynamicPropertySource in Spring");
+ assertThat(persisted.getContent()).isEqualTo("Today's applications...");
+ }
+}
diff --git a/testing-modules/spring-testing-2/src/test/java/com/baeldung/dynamicproperties/ArticleTraditionalLiveTest.java b/testing-modules/spring-testing-2/src/test/java/com/baeldung/dynamicproperties/ArticleTraditionalLiveTest.java
new file mode 100644
index 0000000000..87234505a9
--- /dev/null
+++ b/testing-modules/spring-testing-2/src/test/java/com/baeldung/dynamicproperties/ArticleTraditionalLiveTest.java
@@ -0,0 +1,57 @@
+package com.baeldung.dynamicproperties;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.util.TestPropertyValues;
+import org.springframework.context.ApplicationContextInitializer;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.ContextConfiguration;
+import org.testcontainers.containers.PostgreSQLContainer;
+import org.testcontainers.junit.jupiter.Container;
+import org.testcontainers.junit.jupiter.Testcontainers;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@SpringBootTest
+@Testcontainers
+@ActiveProfiles("pg")
+@ContextConfiguration(initializers = ArticleTraditionalLiveTest.EnvInitializer.class)
+class ArticleTraditionalLiveTest {
+
+ @Container
+ static PostgreSQLContainer> postgres = new PostgreSQLContainer<>("postgres:11")
+ .withDatabaseName("prop")
+ .withUsername("postgres")
+ .withPassword("pass")
+ .withExposedPorts(5432);
+
+ static class EnvInitializer implements ApplicationContextInitializer {
+
+ @Override
+ public void initialize(ConfigurableApplicationContext applicationContext) {
+ TestPropertyValues.of(
+ String.format("spring.datasource.url=jdbc:postgresql://localhost:%d/prop", postgres.getFirstMappedPort()),
+ "spring.datasource.username=postgres",
+ "spring.datasource.password=pass"
+ ).applyTo(applicationContext);
+ }
+ }
+
+ @Autowired
+ private ArticleRepository articleRepository;
+
+ @Test
+ void givenAnArticle_whenPersisted_thenShouldBeAbleToReadIt() {
+ Article article = new Article();
+ article.setTitle("A Guide to @DynamicPropertySource in Spring");
+ article.setContent("Today's applications...");
+
+ articleRepository.save(article);
+ Article persisted = articleRepository.findAll().get(0);
+ assertThat(persisted.getId()).isNotNull();
+ assertThat(persisted.getTitle()).isEqualTo("A Guide to @DynamicPropertySource in Spring");
+ assertThat(persisted.getContent()).isEqualTo("Today's applications...");
+ }
+}
diff --git a/testing-modules/spring-testing-2/src/test/java/com/baeldung/dynamicproperties/PostgreSQLExtension.java b/testing-modules/spring-testing-2/src/test/java/com/baeldung/dynamicproperties/PostgreSQLExtension.java
new file mode 100644
index 0000000000..8c08ad67d7
--- /dev/null
+++ b/testing-modules/spring-testing-2/src/test/java/com/baeldung/dynamicproperties/PostgreSQLExtension.java
@@ -0,0 +1,31 @@
+package com.baeldung.dynamicproperties;
+
+import org.junit.jupiter.api.extension.AfterAllCallback;
+import org.junit.jupiter.api.extension.BeforeAllCallback;
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.testcontainers.containers.PostgreSQLContainer;
+
+public class PostgreSQLExtension implements BeforeAllCallback, AfterAllCallback {
+
+ private PostgreSQLContainer> postgres;
+
+ @Override
+ public void beforeAll(ExtensionContext context) {
+ postgres = new PostgreSQLContainer<>("postgres:11")
+ .withDatabaseName("prop")
+ .withUsername("postgres")
+ .withPassword("pass")
+ .withExposedPorts(5432);
+
+ postgres.start();
+ String jdbcUrl = String.format("jdbc:postgresql://localhost:%d/prop", postgres.getFirstMappedPort());
+ System.setProperty("spring.datasource.url", jdbcUrl);
+ System.setProperty("spring.datasource.username", "postgres");
+ System.setProperty("spring.datasource.password", "pass");
+ }
+
+ @Override
+ public void afterAll(ExtensionContext context) {
+ postgres.stop();
+ }
+}
diff --git a/testing-modules/spring-testing-2/src/test/resources/application-pg.properties b/testing-modules/spring-testing-2/src/test/resources/application-pg.properties
new file mode 100644
index 0000000000..cb7bff1889
--- /dev/null
+++ b/testing-modules/spring-testing-2/src/test/resources/application-pg.properties
@@ -0,0 +1,2 @@
+spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
+spring.jpa.hibernate.ddl-auto=create-drop
\ No newline at end of file