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; - } - - } - }