diff --git a/build.gradle b/build.gradle
index 10a2c8a..c6cd848 100644
--- a/build.gradle
+++ b/build.gradle
@@ -64,6 +64,7 @@ dependencies {
testImplementation 'org.springframework.boot:spring-boot-docker-compose'
testImplementation 'org.testcontainers:junit-jupiter'
testImplementation 'org.testcontainers:mysql'
+ testImplementation 'org.testcontainers:postgresql'
checkstyle "io.spring.javaformat:spring-javaformat-checkstyle:${springJavaformatCheckstyleVersion}"
checkstyle "com.puppycrawl.tools:checkstyle:${checkstyleVersion}"
}
diff --git a/pom.xml b/pom.xml
index 0a4d115..858c2e5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -171,6 +171,11 @@
mysql
test
+
+ org.testcontainers
+ postgresql
+ test
+
jakarta.xml.bind
diff --git a/src/test/java/org/springframework/samples/petclinic/PostgresIntegrationTests.java b/src/test/java/org/springframework/samples/petclinic/PostgresIntegrationTests.java
index 76e460a..6082c3a 100644
--- a/src/test/java/org/springframework/samples/petclinic/PostgresIntegrationTests.java
+++ b/src/test/java/org/springframework/samples/petclinic/PostgresIntegrationTests.java
@@ -16,43 +16,39 @@
package org.springframework.samples.petclinic;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.DisabledInNativeImage;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.builder.SpringApplicationBuilder;
-import org.springframework.boot.context.event.ApplicationPreparedEvent;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.boot.test.web.server.LocalServerPort;
+import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
import org.springframework.boot.web.client.RestTemplateBuilder;
-import org.springframework.context.ApplicationListener;
-import org.springframework.core.env.ConfigurableEnvironment;
-import org.springframework.core.env.EnumerablePropertySource;
-import org.springframework.core.env.PropertySource;
import org.springframework.http.HttpStatus;
import org.springframework.http.RequestEntity;
import org.springframework.http.ResponseEntity;
import org.springframework.samples.petclinic.vet.VetRepository;
import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.aot.DisabledInAotMode;
import org.springframework.web.client.RestTemplate;
-import org.testcontainers.DockerClientFactory;
+import org.testcontainers.containers.PostgreSQLContainer;
+import org.testcontainers.junit.jupiter.Container;
+import org.testcontainers.junit.jupiter.Testcontainers;
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.jupiter.api.Assumptions.assumeTrue;
-@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT,
- properties = { "spring.docker.compose.skip.in-tests=false", "spring.docker.compose.profiles.active=postgres" })
+@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@ActiveProfiles(profiles = { "postgres", "test" })
+@Testcontainers(disabledWithoutDocker = true)
@DisabledInNativeImage
+@DisabledInAotMode
public class PostgresIntegrationTests {
+ @ServiceConnection
+ @Container
+ static PostgreSQLContainer> container = new PostgreSQLContainer<>("postgres:17.0");
+
@LocalServerPort
int port;
@@ -62,23 +58,8 @@ public class PostgresIntegrationTests {
@Autowired
private RestTemplateBuilder builder;
- @BeforeAll
- static void available() {
- assumeTrue(DockerClientFactory.instance().isDockerAvailable(), "Docker not available");
- }
-
- public static void main(String[] args) {
- new SpringApplicationBuilder(PetClinicApplication.class) //
- .profiles("postgres") //
- .properties( //
- "spring.docker.compose.profiles.active=postgres" //
- ) //
- .listeners(new PropertiesLogger()) //
- .run(args);
- }
-
@Test
- void testFindAll() throws Exception {
+ void testFindAll() {
vets.findAll();
vets.findAll(); // served from cache
}
@@ -90,51 +71,4 @@ void testOwnerDetails() {
assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK);
}
- static class PropertiesLogger implements ApplicationListener {
-
- private static final Log log = LogFactory.getLog(PropertiesLogger.class);
-
- private ConfigurableEnvironment environment;
-
- private boolean isFirstRun = true;
-
- @Override
- public void onApplicationEvent(ApplicationPreparedEvent event) {
- if (isFirstRun) {
- environment = event.getApplicationContext().getEnvironment();
- printProperties();
- }
- isFirstRun = false;
- }
-
- public void printProperties() {
- for (EnumerablePropertySource> source : findPropertiesPropertySources()) {
- log.info("PropertySource: " + source.getName());
- String[] names = source.getPropertyNames();
- Arrays.sort(names);
- for (String name : names) {
- String resolved = environment.getProperty(name);
- String value = source.getProperty(name).toString();
- if (resolved.equals(value)) {
- log.info(name + "=" + resolved);
- }
- else {
- log.info(name + "=" + value + " OVERRIDDEN to " + resolved);
- }
- }
- }
- }
-
- private List> findPropertiesPropertySources() {
- List> sources = new LinkedList<>();
- for (PropertySource> source : environment.getPropertySources()) {
- if (source instanceof EnumerablePropertySource enumerable) {
- sources.add(enumerable);
- }
- }
- return sources;
- }
-
- }
-
}