From 77d1db286b760d60b37ede2a998ebb225fcfc4eb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 18 Apr 2026 07:25:05 +0000 Subject: [PATCH 01/23] Initial plan From f3f3c8b348a5bb1a0a19c40773c563c50838e672 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 18 Apr 2026 15:28:01 +0800 Subject: [PATCH 02/23] Bump gradle-wrapper from 9.4.0 to 9.4.1 (#336) Bumps gradle-wrapper from 9.4.0 to 9.4.1. --- updated-dependencies: - dependency-name: gradle-wrapper dependency-version: 9.4.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: rashidi <380073+rashidi@users.noreply.github.com> --- gradle/wrapper/gradle-wrapper.properties | 4 ++-- gradlew | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 92ed9434..8e61ef12 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=60ea723356d81263e8002fec0fcf9e2b0eee0c0850c7a3d7ab0a63f2ccc601f3 -distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.0-bin.zip +distributionSha256Sum=2ab2958f2a1e51120c326cad6f385153bb11ee93b3c216c5fccebfdfbb7ec6cb +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 0262dcbd..739907df 100755 --- a/gradlew +++ b/gradlew @@ -57,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/b631911858264c0b6e4d6603d677ff5218766cee/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/2d6327017519d23b96af35865dc997fcb544fb40/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. From 67e71d3fb38025d05906647dbc3b67e43490603a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 18 Apr 2026 15:28:19 +0800 Subject: [PATCH 03/23] Bump gradle/actions from 5 to 6 (#341) Bumps [gradle/actions](https://github.com/gradle/actions) from 5 to 6. - [Release notes](https://github.com/gradle/actions/releases) - [Commits](https://github.com/gradle/actions/compare/v5...v6) --- updated-dependencies: - dependency-name: gradle/actions dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: rashidi <380073+rashidi@users.noreply.github.com> --- .github/workflows/gradle-build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/gradle-build.yml b/.github/workflows/gradle-build.yml index bb4207b3..f2805b07 100644 --- a/.github/workflows/gradle-build.yml +++ b/.github/workflows/gradle-build.yml @@ -66,7 +66,7 @@ jobs: java-version: '25' distribution: 'temurin' - name: Setup Gradle - uses: gradle/actions/setup-gradle@v5 + uses: gradle/actions/setup-gradle@v6 with: add-job-summary-as-pr-comment: on-failure build-scan-publish: true @@ -98,7 +98,7 @@ jobs: distribution: 'temurin' java-version: 25 - name: Generate and submit dependency graph - uses: gradle/actions/dependency-submission@v5 + uses: gradle/actions/dependency-submission@v6 with: build-scan-publish: true build-scan-terms-of-use-url: "https://gradle.com/terms-of-service" @@ -119,7 +119,7 @@ jobs: java-version: '25' distribution: 'temurin' - name: Setup Gradle - uses: gradle/actions/setup-gradle@v5 + uses: gradle/actions/setup-gradle@v6 with: add-job-summary-as-pr-comment: on-failure build-scan-publish: true From cdb441e784be0095cc13afe06f39343267ac620c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 18 Apr 2026 15:29:05 +0800 Subject: [PATCH 04/23] Bump actions/configure-pages from 5 to 6 (#342) Bumps [actions/configure-pages](https://github.com/actions/configure-pages) from 5 to 6. - [Release notes](https://github.com/actions/configure-pages/releases) - [Commits](https://github.com/actions/configure-pages/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/configure-pages dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: rashidi <380073+rashidi@users.noreply.github.com> --- .github/workflows/build-and-publish-antora.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-publish-antora.yml b/.github/workflows/build-and-publish-antora.yml index a418be81..356a3704 100644 --- a/.github/workflows/build-and-publish-antora.yml +++ b/.github/workflows/build-and-publish-antora.yml @@ -54,7 +54,7 @@ jobs: path: build/site - name: Setup Pages - uses: actions/configure-pages@v5 + uses: actions/configure-pages@v6 - name: Upload Pages artifact uses: actions/upload-pages-artifact@v4 From 01e2243b3a1f0c15abd7f29dd047eca9c4ea7bff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 18 Apr 2026 15:29:17 +0800 Subject: [PATCH 05/23] Bump actions/deploy-pages from 4 to 5 (#343) Bumps [actions/deploy-pages](https://github.com/actions/deploy-pages) from 4 to 5. - [Release notes](https://github.com/actions/deploy-pages/releases) - [Commits](https://github.com/actions/deploy-pages/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/deploy-pages dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: rashidi <380073+rashidi@users.noreply.github.com> --- .github/workflows/build-and-publish-antora.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-publish-antora.yml b/.github/workflows/build-and-publish-antora.yml index 356a3704..c13eb2a2 100644 --- a/.github/workflows/build-and-publish-antora.yml +++ b/.github/workflows/build-and-publish-antora.yml @@ -63,4 +63,4 @@ jobs: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v4 + uses: actions/deploy-pages@v5 From 2f6979e00986c92e0898bed1b50efadfe3d70ac9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 18 Apr 2026 07:38:41 +0000 Subject: [PATCH 06/23] feat: upgrade to Spring Boot 4.0.5 via OpenRewrite recipe Run org.openrewrite.java.spring.boot4.UpgradeSpringBoot_4_0 recipe with manual fixes for root build version, thymeleaf-extras-springsecurity7, Spring Modulith BOM 2.0.5, and removal of hardcoded dependency versions. Agent-Logs-Url: https://github.com/rashidi/spring-boot-tutorials/sessions/53c726ed-2ba4-4f36-9516-fbd787a04e08 Co-authored-by: rashidi <380073+rashidi@users.noreply.github.com> --- batch-rest-repository/build.gradle.kts | 10 ++++----- .../batch/rest/user/UserJobConfiguration.java | 20 +++++++++--------- .../batch/rest/user/UserBatchJobTests.java | 7 ++++--- batch-skip-step/build.gradle.kts | 8 +++---- .../boot/batch/user/UserJobConfiguration.java | 21 ++++++++++--------- .../boot/batch/user/UserBatchJobTests.java | 5 +++-- build.gradle.kts | 2 +- cloud-jdbc-env-repo/build.gradle.kts | 9 ++++---- .../CloudJdbcEnvRepoApplicationTests.java | 8 ++++--- data-domain-events/build.gradle.kts | 9 ++++---- .../de/TestDataDomainEventsApplication.java | 6 +++--- .../de/availability/BookPurchaseTests.java | 6 ++++-- data-envers-audit/build.gradle.kts | 6 +++--- .../data/envers/BookAuditRevisionTests.java | 7 +++---- data-jdbc-audit/build.gradle.kts | 6 +++--- .../jdbc/TestcontainersConfiguration.java | 6 +++--- .../boot/data/jdbc/user/UserAuditTests.java | 4 ++-- data-jdbc-schema-generation/build.gradle.kts | 8 +++---- .../jdbcscgm/TestcontainersConfiguration.java | 6 +++--- data-jpa-audit/build.gradle.kts | 7 ++++--- .../boot/data/user/UserAuditTests.java | 8 +++---- data-jpa-event/build.gradle.kts | 7 ++++--- .../event/TestcontainersConfiguration.java | 6 +++--- .../data/event/user/UserRepositoryTests.java | 8 +++---- data-jpa-filtered-query/build.gradle.kts | 7 ++++--- .../TestDataJpaFilteredQueryApplication.java | 6 +++--- .../jpa/country/CountryRepositoryTests.java | 6 +++--- .../data/jpa/user/UserRepositoryTests.java | 6 +++--- data-jpa-hibernate-cache/build.gradle.kts | 11 +++++----- .../TestcontainersConfiguration.java | 6 +++--- .../customer/CustomerRepositoryTests.java | 2 +- data-mongodb-audit/build.gradle.kts | 6 +++--- .../data/mongodb/user/UserAuditTests.java | 4 ++-- .../build.gradle.kts | 6 +++--- .../character/CharacterRepositoryTests.java | 2 +- data-mongodb-tc-data-load/build.gradle.kts | 8 +++---- .../tc/dataload/user/UserRepositoryTests.java | 4 ++-- data-mongodb-transactional/build.gradle.kts | 9 ++++---- .../data/mongodb/tm/user/CreateUserTests.java | 10 +++++---- data-redis-cache/build.gradle.kts | 7 ++++--- .../cache/TestcontainersConfiguration.java | 6 +++--- .../customer/CustomerRepositoryTests.java | 4 ++-- data-repository-definition/build.gradle.kts | 6 +++--- .../TestcontainersConfiguration.java | 6 +++--- data-rest-composite-id/build.gradle.kts | 7 ++++--- .../datarest/compositeid/book/Author.java | 1 - .../TestcontainersConfiguration.java | 6 +++--- .../compositeid/book/CreateAuthorTests.java | 2 +- .../compositeid/book/CreateBookTests.java | 2 +- .../compositeid/book/GetBookTests.java | 2 +- data-rest-validation/build.gradle.kts | 9 ++++---- .../TestDataRestValidationApplication.java | 8 +++---- .../boot/data/rest/book/CreateBookTests.java | 4 +++- graphql/build.gradle.kts | 4 ++-- jooq/build.gradle.kts | 6 +++--- .../boot/jooq/TestJooqApplication.java | 6 +++--- .../boot/jooq/user/UserRepositoryTests.java | 4 ++-- modulith/build.gradle.kts | 8 +++---- .../modulith/TestcontainersConfiguration.java | 6 +++--- test-execution-listeners/build.gradle.kts | 6 +++--- .../boot/test/user/UserRepositoryTests.java | 4 ++-- test-rest-assured/build.gradle.kts | 9 ++++---- .../test/restassured/user/UserReadOnly.java | 4 ++-- .../TestTestRestAssuredApplication.java | 2 +- .../restassured/user/CreateUserTests.java | 6 +++--- .../restassured/user/DeleteUserTests.java | 6 +++--- .../user/FindUserByUsernameTests.java | 6 +++--- test-slice-tests-rest/build.gradle.kts | 12 ++++++----- .../slices/TestcontainersConfiguration.java | 6 +++--- .../test/slices/user/FindByUsernameTests.java | 4 +++- .../test/slices/user/UserRepositoryTests.java | 6 +++--- .../test/slices/user/UserResourceTests.java | 2 +- web-rest-client/build.gradle.kts | 6 ++++-- .../restclient/post/PostRepositoryTests.java | 10 ++++----- .../restclient/user/UserRepositoryTests.java | 10 ++++----- web-thymeleaf-xss/build.gradle.kts | 9 ++++---- .../web/xss/greet/GreetResourceTests.java | 2 +- 77 files changed, 262 insertions(+), 235 deletions(-) diff --git a/batch-rest-repository/build.gradle.kts b/batch-rest-repository/build.gradle.kts index 967f6ee6..9ef5fbdd 100644 --- a/batch-rest-repository/build.gradle.kts +++ b/batch-rest-repository/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -20,14 +20,14 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter-batch") implementation("org.springframework.boot:spring-boot-starter-data-mongodb") - implementation("com.fasterxml.jackson.core:jackson-databind") + implementation("tools.jackson.core:jackson-databind") runtimeOnly("com.mysql:mysql-connector-j") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.springframework.batch:spring-batch-test") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:mongodb") - testImplementation("org.testcontainers:mysql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-mongodb") + testImplementation("org.testcontainers:testcontainers-mysql") } tasks.named("test") { diff --git a/batch-rest-repository/src/main/java/zin/rashidi/boot/batch/rest/user/UserJobConfiguration.java b/batch-rest-repository/src/main/java/zin/rashidi/boot/batch/rest/user/UserJobConfiguration.java index e5e86bc3..4c9f7e85 100644 --- a/batch-rest-repository/src/main/java/zin/rashidi/boot/batch/rest/user/UserJobConfiguration.java +++ b/batch-rest-repository/src/main/java/zin/rashidi/boot/batch/rest/user/UserJobConfiguration.java @@ -1,24 +1,24 @@ package zin.rashidi.boot.batch.rest.user; import java.net.MalformedURLException; - -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import tools.jackson.databind.json.JsonMapper; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; -import org.springframework.batch.item.data.MongoItemWriter; -import org.springframework.batch.item.data.builder.MongoItemWriterBuilder; -import org.springframework.batch.item.json.JacksonJsonObjectReader; -import org.springframework.batch.item.json.JsonItemReader; -import org.springframework.batch.item.json.builder.JsonItemReaderBuilder; +import org.springframework.batch.infrastructure.item.data.MongoItemWriter; +import org.springframework.batch.infrastructure.item.data.builder.MongoItemWriterBuilder; +import org.springframework.batch.infrastructure.item.json.JacksonJsonObjectReader; +import org.springframework.batch.infrastructure.item.json.JsonItemReader; +import org.springframework.batch.infrastructure.item.json.builder.JsonItemReaderBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.UrlResource; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.transaction.PlatformTransactionManager; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; /** * @author Rashidi Zin @@ -26,7 +26,7 @@ @Configuration class UserJobConfiguration { - private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + private static final ObjectMapper OBJECT_MAPPER = new JsonMapper(); private final JobRepository jobRepository; private final PlatformTransactionManager transactionManager; diff --git a/batch-rest-repository/src/test/java/zin/rashidi/boot/batch/rest/user/UserBatchJobTests.java b/batch-rest-repository/src/test/java/zin/rashidi/boot/batch/rest/user/UserBatchJobTests.java index a54d89e6..34bf61e7 100644 --- a/batch-rest-repository/src/test/java/zin/rashidi/boot/batch/rest/user/UserBatchJobTests.java +++ b/batch-rest-repository/src/test/java/zin/rashidi/boot/batch/rest/user/UserBatchJobTests.java @@ -5,6 +5,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.batch.core.configuration.support.DefaultBatchConfiguration; +import org.springframework.batch.core.job.JobExecution; import org.springframework.batch.test.JobLauncherTestUtils; import org.springframework.batch.test.context.SpringBatchTest; import org.springframework.beans.factory.annotation.Autowired; @@ -17,10 +18,10 @@ import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.jdbc.support.JdbcTransactionManager; import org.springframework.transaction.PlatformTransactionManager; -import org.testcontainers.containers.MongoDBContainer; -import org.testcontainers.containers.MySQLContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mongodb.MongoDBContainer; +import org.testcontainers.mysql.MySQLContainer; import javax.sql.DataSource; @@ -42,7 +43,7 @@ class UserBatchJobTests { @Container @ServiceConnection - private final static MySQLContainer MYSQL_CONTAINER = new MySQLContainer<>("mysql:lts") + private final static MySQLContainer MYSQL_CONTAINER = new MySQLContainer("mysql:lts") .withInitScript("org/springframework/batch/core/schema-mysql.sql"); @Container diff --git a/batch-skip-step/build.gradle.kts b/batch-skip-step/build.gradle.kts index 4b03d08c..ee8c24b0 100644 --- a/batch-skip-step/build.gradle.kts +++ b/batch-skip-step/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -20,13 +20,13 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter-batch") implementation("org.springframework.boot:spring-boot-starter-data-jdbc") - implementation("com.fasterxml.jackson.core:jackson-databind") + implementation("tools.jackson.core:jackson-databind") runtimeOnly("com.mysql:mysql-connector-j") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.springframework.batch:spring-batch-test") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:mysql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-mysql") } tasks.named("test") { diff --git a/batch-skip-step/src/main/java/zin/rashidi/boot/batch/user/UserJobConfiguration.java b/batch-skip-step/src/main/java/zin/rashidi/boot/batch/user/UserJobConfiguration.java index 1588bf0f..91d10847 100644 --- a/batch-skip-step/src/main/java/zin/rashidi/boot/batch/user/UserJobConfiguration.java +++ b/batch-skip-step/src/main/java/zin/rashidi/boot/batch/user/UserJobConfiguration.java @@ -1,17 +1,18 @@ package zin.rashidi.boot.batch.user; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.Step; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.Step; import org.springframework.batch.core.step.builder.StepBuilder; -import org.springframework.batch.item.ItemProcessor; -import org.springframework.batch.item.database.JdbcBatchItemWriter; -import org.springframework.batch.item.database.builder.JdbcBatchItemWriterBuilder; -import org.springframework.batch.item.json.JacksonJsonObjectReader; -import org.springframework.batch.item.json.JsonItemReader; -import org.springframework.batch.item.json.builder.JsonItemReaderBuilder; +import org.springframework.batch.infrastructure.item.ItemProcessor; +import org.springframework.batch.infrastructure.item.database.JdbcBatchItemWriter; +import org.springframework.batch.infrastructure.item.database.builder.JdbcBatchItemWriterBuilder; +import org.springframework.batch.infrastructure.item.json.JacksonJsonObjectReader; +import org.springframework.batch.infrastructure.item.json.JsonItemReader; +import org.springframework.batch.infrastructure.item.json.builder.JsonItemReaderBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; @@ -25,7 +26,7 @@ @Configuration class UserJobConfiguration { - private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + private static final ObjectMapper OBJECT_MAPPER = new JsonMapper(); private JsonItemReader reader() { JacksonJsonObjectReader reader = new JacksonJsonObjectReader<>(UserFile.class); diff --git a/batch-skip-step/src/test/java/zin/rashidi/boot/batch/user/UserBatchJobTests.java b/batch-skip-step/src/test/java/zin/rashidi/boot/batch/user/UserBatchJobTests.java index 54540225..40136301 100644 --- a/batch-skip-step/src/test/java/zin/rashidi/boot/batch/user/UserBatchJobTests.java +++ b/batch-skip-step/src/test/java/zin/rashidi/boot/batch/user/UserBatchJobTests.java @@ -4,6 +4,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.batch.core.configuration.support.DefaultBatchConfiguration; +import org.springframework.batch.core.job.JobExecution; import org.springframework.batch.test.JobLauncherTestUtils; import org.springframework.batch.test.context.SpringBatchTest; import org.springframework.beans.factory.annotation.Autowired; @@ -16,9 +17,9 @@ import org.springframework.jdbc.support.JdbcTransactionManager; import org.springframework.test.context.jdbc.Sql; import org.springframework.transaction.PlatformTransactionManager; -import org.testcontainers.containers.MySQLContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mysql.MySQLContainer; import javax.sql.DataSource; @@ -51,7 +52,7 @@ class UserBatchJobTests { @Container @ServiceConnection - private final static MySQLContainer MYSQL_CONTAINER = new MySQLContainer<>("mysql:lts"); + private final static MySQLContainer MYSQL_CONTAINER = new MySQLContainer("mysql:lts"); @Autowired private JobLauncherTestUtils launcher; diff --git a/build.gradle.kts b/build.gradle.kts index c9db1bc8..6d0af3d4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,7 +2,7 @@ import org.springframework.boot.gradle.plugin.SpringBootPlugin plugins { java - id("org.springframework.boot") version "3.5.7" apply false + id("org.springframework.boot") version "4.0.5" apply false id("io.spring.dependency-management") version "1.1.7" id("org.sonarqube") version "7.2.3.7755" id("jacoco-report-aggregation") diff --git a/cloud-jdbc-env-repo/build.gradle.kts b/cloud-jdbc-env-repo/build.gradle.kts index 1365b130..91627f02 100644 --- a/cloud-jdbc-env-repo/build.gradle.kts +++ b/cloud-jdbc-env-repo/build.gradle.kts @@ -1,13 +1,13 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } group = "zin.rashidi.boot" version = "0.0.1-SNAPSHOT" -val springCloudVersion = "2025.0.0" +val springCloudVersion = "2025.1.1" java { toolchain { @@ -32,11 +32,12 @@ dependencies { implementation("org.springframework.cloud:spring-cloud-starter-bootstrap") implementation("org.springframework.cloud:spring-cloud-config-server") runtimeOnly("com.mysql:mysql-connector-j") + testImplementation("org.springframework.boot:spring-boot-resttestclient") annotationProcessor("org.springframework.boot:spring-boot-configuration-processor") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:mysql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-mysql") } tasks.named("test") { diff --git a/cloud-jdbc-env-repo/src/test/java/zin/rashidi/boot/cloud/jdbcenvrepo/CloudJdbcEnvRepoApplicationTests.java b/cloud-jdbc-env-repo/src/test/java/zin/rashidi/boot/cloud/jdbcenvrepo/CloudJdbcEnvRepoApplicationTests.java index ba2d8cfa..5f470386 100644 --- a/cloud-jdbc-env-repo/src/test/java/zin/rashidi/boot/cloud/jdbcenvrepo/CloudJdbcEnvRepoApplicationTests.java +++ b/cloud-jdbc-env-repo/src/test/java/zin/rashidi/boot/cloud/jdbcenvrepo/CloudJdbcEnvRepoApplicationTests.java @@ -3,21 +3,23 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.resttestclient.autoconfigure.AutoConfigureTestRestTemplate; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.client.TestRestTemplate; -import org.testcontainers.containers.MySQLContainer; +import org.springframework.boot.resttestclient.TestRestTemplate; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mysql.MySQLContainer; import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; +@AutoConfigureTestRestTemplate @Testcontainers @SpringBootTest(properties = "spring.datasource.url=jdbc:tc:mysql:lts:///test?TC_INITSCRIPT=init-script.sql", webEnvironment = RANDOM_PORT) class CloudJdbcEnvRepoApplicationTests { @Container - private static final MySQLContainer MYSQL = new MySQLContainer<>("mysql:lts"); + private static final MySQLContainer MYSQL = new MySQLContainer("mysql:lts"); @Autowired private TestRestTemplate restClient; diff --git a/data-domain-events/build.gradle.kts b/data-domain-events/build.gradle.kts index 86a71724..8d5f0e58 100644 --- a/data-domain-events/build.gradle.kts +++ b/data-domain-events/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -19,12 +19,13 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter-data-jpa") - implementation("org.springframework.boot:spring-boot-starter-web") + implementation("org.springframework.boot:spring-boot-starter-webmvc") runtimeOnly("com.mysql:mysql-connector-j") + testImplementation("org.springframework.boot:spring-boot-resttestclient") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:mysql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-mysql") } tasks.named("test") { diff --git a/data-domain-events/src/test/java/zin/rashidi/boot/data/de/TestDataDomainEventsApplication.java b/data-domain-events/src/test/java/zin/rashidi/boot/data/de/TestDataDomainEventsApplication.java index e2ab7bbf..69ce8800 100644 --- a/data-domain-events/src/test/java/zin/rashidi/boot/data/de/TestDataDomainEventsApplication.java +++ b/data-domain-events/src/test/java/zin/rashidi/boot/data/de/TestDataDomainEventsApplication.java @@ -4,15 +4,15 @@ import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; -import org.testcontainers.containers.MySQLContainer; +import org.testcontainers.mysql.MySQLContainer; @TestConfiguration(proxyBeanMethods = false) public class TestDataDomainEventsApplication { @Bean @ServiceConnection - MySQLContainer mysqlContainer() { - return new MySQLContainer<>("mysql:lts"); + MySQLContainer mysqlContainer() { + return new MySQLContainer("mysql:lts"); } public static void main(String[] args) { diff --git a/data-domain-events/src/test/java/zin/rashidi/boot/data/de/availability/BookPurchaseTests.java b/data-domain-events/src/test/java/zin/rashidi/boot/data/de/availability/BookPurchaseTests.java index cee9c59f..1267d064 100644 --- a/data-domain-events/src/test/java/zin/rashidi/boot/data/de/availability/BookPurchaseTests.java +++ b/data-domain-events/src/test/java/zin/rashidi/boot/data/de/availability/BookPurchaseTests.java @@ -6,9 +6,10 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.resttestclient.autoconfigure.AutoConfigureTestRestTemplate; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.resttestclient.TestRestTemplate; import zin.rashidi.boot.data.de.TestDataDomainEventsApplication; import zin.rashidi.boot.data.de.book.Book; @@ -17,6 +18,7 @@ /** * @author Rashidi Zin */ +@AutoConfigureTestRestTemplate @SpringBootTest( classes = TestDataDomainEventsApplication.class, properties = "spring.jpa.hibernate.ddl-auto=create", diff --git a/data-envers-audit/build.gradle.kts b/data-envers-audit/build.gradle.kts index a67ef353..e7bcf2ef 100644 --- a/data-envers-audit/build.gradle.kts +++ b/data-envers-audit/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -23,8 +23,8 @@ dependencies { runtimeOnly("com.mysql:mysql-connector-j") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:mysql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-mysql") } tasks.named("test") { diff --git a/data-envers-audit/src/test/java/zin/rashidi/boot/data/envers/BookAuditRevisionTests.java b/data-envers-audit/src/test/java/zin/rashidi/boot/data/envers/BookAuditRevisionTests.java index 0d9249cd..f3a61d38 100644 --- a/data-envers-audit/src/test/java/zin/rashidi/boot/data/envers/BookAuditRevisionTests.java +++ b/data-envers-audit/src/test/java/zin/rashidi/boot/data/envers/BookAuditRevisionTests.java @@ -12,10 +12,9 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.data.history.Revision; -import org.testcontainers.containers.MySQLContainer; import org.testcontainers.junit.jupiter.Container; -import org.testcontainers.junit.jupiter.Testcontainers; - +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mysql.MySQLContainer; import zin.rashidi.boot.data.envers.book.Book; import zin.rashidi.boot.data.envers.book.BookRepository; @@ -28,7 +27,7 @@ class BookAuditRevisionTests { @Container @ServiceConnection - private static final MySQLContainer MYSQL = new MySQLContainer<>("mysql:lts"); + private static final MySQLContainer MYSQL = new MySQLContainer("mysql:lts"); @Autowired private BookRepository repository; diff --git a/data-jdbc-audit/build.gradle.kts b/data-jdbc-audit/build.gradle.kts index d99dfabb..b79cf7fb 100644 --- a/data-jdbc-audit/build.gradle.kts +++ b/data-jdbc-audit/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -22,8 +22,8 @@ dependencies { runtimeOnly("org.postgresql:postgresql") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:postgresql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-postgresql") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/data-jdbc-audit/src/test/java/zin/rashidi/boot/data/jdbc/TestcontainersConfiguration.java b/data-jdbc-audit/src/test/java/zin/rashidi/boot/data/jdbc/TestcontainersConfiguration.java index 6f705f7f..7b2c81a3 100644 --- a/data-jdbc-audit/src/test/java/zin/rashidi/boot/data/jdbc/TestcontainersConfiguration.java +++ b/data-jdbc-audit/src/test/java/zin/rashidi/boot/data/jdbc/TestcontainersConfiguration.java @@ -3,7 +3,7 @@ import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; -import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.postgresql.PostgreSQLContainer; import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) @@ -11,8 +11,8 @@ class TestcontainersConfiguration { @Bean @ServiceConnection - PostgreSQLContainer postgresContainer() { - return new PostgreSQLContainer<>(DockerImageName.parse("postgres:latest")); + PostgreSQLContainer postgresContainer() { + return new PostgreSQLContainer(DockerImageName.parse("postgres:latest")); } } diff --git a/data-jdbc-audit/src/test/java/zin/rashidi/boot/data/jdbc/user/UserAuditTests.java b/data-jdbc-audit/src/test/java/zin/rashidi/boot/data/jdbc/user/UserAuditTests.java index 58924736..341ee990 100644 --- a/data-jdbc-audit/src/test/java/zin/rashidi/boot/data/jdbc/user/UserAuditTests.java +++ b/data-jdbc-audit/src/test/java/zin/rashidi/boot/data/jdbc/user/UserAuditTests.java @@ -9,9 +9,9 @@ import org.springframework.data.jdbc.repository.config.EnableJdbcAuditing; import org.springframework.test.context.jdbc.Sql; import org.springframework.test.util.ReflectionTestUtils; -import org.testcontainers.containers.PostgreSQLContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.postgresql.PostgreSQLContainer; import org.testcontainers.utility.DockerImageName; import java.time.Instant; @@ -32,7 +32,7 @@ class UserAuditTests { @Container @ServiceConnection - private static final PostgreSQLContainer postgres = new PostgreSQLContainer<>(DockerImageName.parse("postgres:latest")); + private static final PostgreSQLContainer postgres = new PostgreSQLContainer(DockerImageName.parse("postgres:latest")); @Autowired private UserRepository repository; diff --git a/data-jdbc-schema-generation/build.gradle.kts b/data-jdbc-schema-generation/build.gradle.kts index 9f2c6af0..54e22b55 100644 --- a/data-jdbc-schema-generation/build.gradle.kts +++ b/data-jdbc-schema-generation/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -19,12 +19,12 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter-data-jdbc") - implementation("org.liquibase:liquibase-core") + implementation("org.springframework.boot:spring-boot-starter-liquibase") runtimeOnly("org.postgresql:postgresql") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:postgresql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-postgresql") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/data-jdbc-schema-generation/src/test/java/zin/rashidi/boot/jdbcscgm/TestcontainersConfiguration.java b/data-jdbc-schema-generation/src/test/java/zin/rashidi/boot/jdbcscgm/TestcontainersConfiguration.java index 4a4c29e8..8b9b6ebd 100644 --- a/data-jdbc-schema-generation/src/test/java/zin/rashidi/boot/jdbcscgm/TestcontainersConfiguration.java +++ b/data-jdbc-schema-generation/src/test/java/zin/rashidi/boot/jdbcscgm/TestcontainersConfiguration.java @@ -3,7 +3,7 @@ import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; -import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.postgresql.PostgreSQLContainer; import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) @@ -11,8 +11,8 @@ public class TestcontainersConfiguration { @Bean @ServiceConnection - PostgreSQLContainer postgresContainer() { - return new PostgreSQLContainer<>(DockerImageName.parse("postgres:latest")); + PostgreSQLContainer postgresContainer() { + return new PostgreSQLContainer(DockerImageName.parse("postgres:latest")); } } diff --git a/data-jpa-audit/build.gradle.kts b/data-jpa-audit/build.gradle.kts index 65c861c6..e18df045 100644 --- a/data-jpa-audit/build.gradle.kts +++ b/data-jpa-audit/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -20,10 +20,11 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter-data-jpa") runtimeOnly("com.mysql:mysql-connector-j") + testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:mysql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-mysql") } tasks.named("test") { diff --git a/data-jpa-audit/src/test/java/zin/rashidi/boot/data/user/UserAuditTests.java b/data-jpa-audit/src/test/java/zin/rashidi/boot/data/user/UserAuditTests.java index b1244e8b..02594bf7 100644 --- a/data-jpa-audit/src/test/java/zin/rashidi/boot/data/user/UserAuditTests.java +++ b/data-jpa-audit/src/test/java/zin/rashidi/boot/data/user/UserAuditTests.java @@ -3,15 +3,15 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.data.jpa.test.autoconfigure.DataJpaTest; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; import org.springframework.test.context.jdbc.Sql; import org.springframework.test.util.ReflectionTestUtils; -import org.testcontainers.containers.MySQLContainer; import org.testcontainers.junit.jupiter.Container; -import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mysql.MySQLContainer; import java.time.Instant; @@ -26,7 +26,7 @@ class UserAuditTests { @Container @ServiceConnection - private final static MySQLContainer MYSQL = new MySQLContainer<>("mysql:lts"); + private final static MySQLContainer MYSQL = new MySQLContainer("mysql:lts"); @Autowired private UserRepository repository; diff --git a/data-jpa-event/build.gradle.kts b/data-jpa-event/build.gradle.kts index 7bdc163b..2f21e37e 100644 --- a/data-jpa-event/build.gradle.kts +++ b/data-jpa-event/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -20,10 +20,11 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter-data-jpa") runtimeOnly("org.postgresql:postgresql") + testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:postgresql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-postgresql") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/data-jpa-event/src/test/java/zin/rashidi/data/event/TestcontainersConfiguration.java b/data-jpa-event/src/test/java/zin/rashidi/data/event/TestcontainersConfiguration.java index c83abe78..fbd5fc2c 100644 --- a/data-jpa-event/src/test/java/zin/rashidi/data/event/TestcontainersConfiguration.java +++ b/data-jpa-event/src/test/java/zin/rashidi/data/event/TestcontainersConfiguration.java @@ -3,7 +3,7 @@ import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; -import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.postgresql.PostgreSQLContainer; import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) @@ -11,8 +11,8 @@ class TestcontainersConfiguration { @Bean @ServiceConnection - PostgreSQLContainer postgresContainer() { - return new PostgreSQLContainer<>(DockerImageName.parse("postgres:latest")); + PostgreSQLContainer postgresContainer() { + return new PostgreSQLContainer(DockerImageName.parse("postgres:latest")); } } diff --git a/data-jpa-event/src/test/java/zin/rashidi/data/event/user/UserRepositoryTests.java b/data-jpa-event/src/test/java/zin/rashidi/data/event/user/UserRepositoryTests.java index 268c7242..f25ef489 100644 --- a/data-jpa-event/src/test/java/zin/rashidi/data/event/user/UserRepositoryTests.java +++ b/data-jpa-event/src/test/java/zin/rashidi/data/event/user/UserRepositoryTests.java @@ -3,13 +3,13 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; +import org.springframework.boot.data.jpa.test.autoconfigure.DataJpaTest; +import org.springframework.boot.data.jpa.test.autoconfigure.TestEntityManager; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.ComponentScan.Filter; -import org.testcontainers.containers.PostgreSQLContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.postgresql.PostgreSQLContainer; import org.testcontainers.utility.DockerImageName; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -24,7 +24,7 @@ class UserRepositoryTests { @Container @ServiceConnection - private static final PostgreSQLContainer postgresql = new PostgreSQLContainer<>(DockerImageName.parse("postgres:latest")); + private static final PostgreSQLContainer postgresql = new PostgreSQLContainer(DockerImageName.parse("postgres:latest")); @Autowired private TestEntityManager em; diff --git a/data-jpa-filtered-query/build.gradle.kts b/data-jpa-filtered-query/build.gradle.kts index 65c861c6..e18df045 100644 --- a/data-jpa-filtered-query/build.gradle.kts +++ b/data-jpa-filtered-query/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -20,10 +20,11 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter-data-jpa") runtimeOnly("com.mysql:mysql-connector-j") + testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:mysql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-mysql") } tasks.named("test") { diff --git a/data-jpa-filtered-query/src/test/java/zin/rashidi/boot/data/jpa/TestDataJpaFilteredQueryApplication.java b/data-jpa-filtered-query/src/test/java/zin/rashidi/boot/data/jpa/TestDataJpaFilteredQueryApplication.java index fb58524f..7ad7f51f 100644 --- a/data-jpa-filtered-query/src/test/java/zin/rashidi/boot/data/jpa/TestDataJpaFilteredQueryApplication.java +++ b/data-jpa-filtered-query/src/test/java/zin/rashidi/boot/data/jpa/TestDataJpaFilteredQueryApplication.java @@ -4,7 +4,7 @@ import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; -import org.testcontainers.containers.MySQLContainer; +import org.testcontainers.mysql.MySQLContainer; import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) @@ -12,8 +12,8 @@ public class TestDataJpaFilteredQueryApplication { @Bean @ServiceConnection - MySQLContainer mysqlContainer() { - return new MySQLContainer<>(DockerImageName.parse("mysql:lts")); + MySQLContainer mysqlContainer() { + return new MySQLContainer(DockerImageName.parse("mysql:lts")); } public static void main(String[] args) { diff --git a/data-jpa-filtered-query/src/test/java/zin/rashidi/boot/data/jpa/country/CountryRepositoryTests.java b/data-jpa-filtered-query/src/test/java/zin/rashidi/boot/data/jpa/country/CountryRepositoryTests.java index 4b122294..9b5b4c5a 100644 --- a/data-jpa-filtered-query/src/test/java/zin/rashidi/boot/data/jpa/country/CountryRepositoryTests.java +++ b/data-jpa-filtered-query/src/test/java/zin/rashidi/boot/data/jpa/country/CountryRepositoryTests.java @@ -4,13 +4,13 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.data.jpa.test.autoconfigure.DataJpaTest; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; -import org.testcontainers.containers.MySQLContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mysql.MySQLContainer; import java.util.List; @@ -29,7 +29,7 @@ class CountryRepositoryTests { @Container @ServiceConnection - private static final MySQLContainer mysql = new MySQLContainer<>("mysql:lts"); + private static final MySQLContainer mysql = new MySQLContainer("mysql:lts"); @Autowired private CountryRepository countries; diff --git a/data-jpa-filtered-query/src/test/java/zin/rashidi/boot/data/jpa/user/UserRepositoryTests.java b/data-jpa-filtered-query/src/test/java/zin/rashidi/boot/data/jpa/user/UserRepositoryTests.java index e92210b6..26315ad9 100644 --- a/data-jpa-filtered-query/src/test/java/zin/rashidi/boot/data/jpa/user/UserRepositoryTests.java +++ b/data-jpa-filtered-query/src/test/java/zin/rashidi/boot/data/jpa/user/UserRepositoryTests.java @@ -4,13 +4,13 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.data.jpa.test.autoconfigure.DataJpaTest; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; -import org.testcontainers.containers.MySQLContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mysql.MySQLContainer; import java.util.List; @@ -31,7 +31,7 @@ class UserRepositoryTests { @Container @ServiceConnection - private static final MySQLContainer mysql = new MySQLContainer<>("mysql:lts"); + private static final MySQLContainer mysql = new MySQLContainer("mysql:lts"); @Autowired private UserRepository users; diff --git a/data-jpa-hibernate-cache/build.gradle.kts b/data-jpa-hibernate-cache/build.gradle.kts index 80c66512..17aec68e 100644 --- a/data-jpa-hibernate-cache/build.gradle.kts +++ b/data-jpa-hibernate-cache/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -18,14 +18,15 @@ repositories { } dependencies { - implementation("org.ehcache:ehcache::jakarta") + implementation("org.ehcache:ehcache:3.10.9:jakarta") implementation("org.hibernate.orm:hibernate-jcache") implementation("org.springframework.boot:spring-boot-starter-data-jpa") runtimeOnly("org.postgresql:postgresql") - testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test") + testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:postgresql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-postgresql") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/data-jpa-hibernate-cache/src/test/java/zin/rashidi/datajpa/hibernatecache/TestcontainersConfiguration.java b/data-jpa-hibernate-cache/src/test/java/zin/rashidi/datajpa/hibernatecache/TestcontainersConfiguration.java index bedc6fa6..3a3d0532 100644 --- a/data-jpa-hibernate-cache/src/test/java/zin/rashidi/datajpa/hibernatecache/TestcontainersConfiguration.java +++ b/data-jpa-hibernate-cache/src/test/java/zin/rashidi/datajpa/hibernatecache/TestcontainersConfiguration.java @@ -3,7 +3,7 @@ import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; -import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.postgresql.PostgreSQLContainer; import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) @@ -11,8 +11,8 @@ public class TestcontainersConfiguration { @Bean @ServiceConnection - PostgreSQLContainer postgresContainer() { - return new PostgreSQLContainer<>(DockerImageName.parse("postgres:latest")); + PostgreSQLContainer postgresContainer() { + return new PostgreSQLContainer(DockerImageName.parse("postgres:latest")); } } diff --git a/data-jpa-hibernate-cache/src/test/java/zin/rashidi/datajpa/hibernatecache/customer/CustomerRepositoryTests.java b/data-jpa-hibernate-cache/src/test/java/zin/rashidi/datajpa/hibernatecache/customer/CustomerRepositoryTests.java index 82090a63..8f456daa 100644 --- a/data-jpa-hibernate-cache/src/test/java/zin/rashidi/datajpa/hibernatecache/customer/CustomerRepositoryTests.java +++ b/data-jpa-hibernate-cache/src/test/java/zin/rashidi/datajpa/hibernatecache/customer/CustomerRepositoryTests.java @@ -6,7 +6,7 @@ import org.junit.jupiter.api.*; import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.data.jpa.test.autoconfigure.DataJpaTest; import org.springframework.context.annotation.Import; import org.springframework.test.context.jdbc.Sql; import org.springframework.transaction.annotation.Transactional; diff --git a/data-mongodb-audit/build.gradle.kts b/data-mongodb-audit/build.gradle.kts index 0a0874b9..c640ea4f 100644 --- a/data-mongodb-audit/build.gradle.kts +++ b/data-mongodb-audit/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -21,8 +21,8 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-data-mongodb") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:mongodb") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-mongodb") } tasks.named("test") { diff --git a/data-mongodb-audit/src/test/java/zin/rashidi/boot/data/mongodb/user/UserAuditTests.java b/data-mongodb-audit/src/test/java/zin/rashidi/boot/data/mongodb/user/UserAuditTests.java index 5469b91d..35b34b15 100644 --- a/data-mongodb-audit/src/test/java/zin/rashidi/boot/data/mongodb/user/UserAuditTests.java +++ b/data-mongodb-audit/src/test/java/zin/rashidi/boot/data/mongodb/user/UserAuditTests.java @@ -12,9 +12,9 @@ import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.data.mongodb.config.EnableMongoAuditing; -import org.testcontainers.containers.MongoDBContainer; import org.testcontainers.junit.jupiter.Container; -import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mongodb.MongoDBContainer; /** * @author Rashidi Zin diff --git a/data-mongodb-full-text-search/build.gradle.kts b/data-mongodb-full-text-search/build.gradle.kts index 0a0874b9..c640ea4f 100644 --- a/data-mongodb-full-text-search/build.gradle.kts +++ b/data-mongodb-full-text-search/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -21,8 +21,8 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-data-mongodb") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:mongodb") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-mongodb") } tasks.named("test") { diff --git a/data-mongodb-full-text-search/src/test/java/zin/rashidi/boot/data/mongodb/character/CharacterRepositoryTests.java b/data-mongodb-full-text-search/src/test/java/zin/rashidi/boot/data/mongodb/character/CharacterRepositoryTests.java index 9ce38f34..fe478173 100644 --- a/data-mongodb-full-text-search/src/test/java/zin/rashidi/boot/data/mongodb/character/CharacterRepositoryTests.java +++ b/data-mongodb-full-text-search/src/test/java/zin/rashidi/boot/data/mongodb/character/CharacterRepositoryTests.java @@ -15,9 +15,9 @@ import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.index.TextIndexDefinition; import org.springframework.data.mongodb.core.query.TextCriteria; -import org.testcontainers.containers.MongoDBContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mongodb.MongoDBContainer; /** * @author Rashidi Zin diff --git a/data-mongodb-tc-data-load/build.gradle.kts b/data-mongodb-tc-data-load/build.gradle.kts index 3b9aa08a..088dfdd5 100644 --- a/data-mongodb-tc-data-load/build.gradle.kts +++ b/data-mongodb-tc-data-load/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -21,9 +21,9 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-data-mongodb") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:mongodb") - testImplementation("com.fasterxml.jackson.core:jackson-databind") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-mongodb") + testImplementation("tools.jackson.core:jackson-databind") } tasks.named("test") { diff --git a/data-mongodb-tc-data-load/src/test/java/zin/rashidi/data/mongodb/tc/dataload/user/UserRepositoryTests.java b/data-mongodb-tc-data-load/src/test/java/zin/rashidi/data/mongodb/tc/dataload/user/UserRepositoryTests.java index c1a647d7..55c044a9 100644 --- a/data-mongodb-tc-data-load/src/test/java/zin/rashidi/data/mongodb/tc/dataload/user/UserRepositoryTests.java +++ b/data-mongodb-tc-data-load/src/test/java/zin/rashidi/data/mongodb/tc/dataload/user/UserRepositoryTests.java @@ -11,9 +11,9 @@ import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.data.repository.init.Jackson2RepositoryPopulatorFactoryBean; -import org.testcontainers.containers.MongoDBContainer; import org.testcontainers.junit.jupiter.Container; -import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mongodb.MongoDBContainer; import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.context.annotation.FilterType.ASSIGNABLE_TYPE; diff --git a/data-mongodb-transactional/build.gradle.kts b/data-mongodb-transactional/build.gradle.kts index 1a614a13..19dfedc0 100644 --- a/data-mongodb-transactional/build.gradle.kts +++ b/data-mongodb-transactional/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -19,11 +19,12 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter-data-mongodb") - implementation("org.springframework.boot:spring-boot-starter-web") + implementation("org.springframework.boot:spring-boot-starter-webmvc") + testImplementation("org.springframework.boot:spring-boot-resttestclient") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:mongodb") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-mongodb") } tasks.named("test") { diff --git a/data-mongodb-transactional/src/test/java/zin/rashidi/boot/data/mongodb/tm/user/CreateUserTests.java b/data-mongodb-transactional/src/test/java/zin/rashidi/boot/data/mongodb/tm/user/CreateUserTests.java index 588f0d3e..709b5ed9 100644 --- a/data-mongodb-transactional/src/test/java/zin/rashidi/boot/data/mongodb/tm/user/CreateUserTests.java +++ b/data-mongodb-transactional/src/test/java/zin/rashidi/boot/data/mongodb/tm/user/CreateUserTests.java @@ -1,15 +1,16 @@ package zin.rashidi.boot.data.mongodb.tm.user; import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.resttestclient.autoconfigure.AutoConfigureTestRestTemplate; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.resttestclient.TestRestTemplate; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; -import org.testcontainers.containers.MongoDBContainer; import org.testcontainers.junit.jupiter.Container; -import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mongodb.MongoDBContainer; import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; @@ -20,6 +21,7 @@ /** * @author Rashidi Zin */ +@AutoConfigureTestRestTemplate @SpringBootTest(webEnvironment = RANDOM_PORT) @Testcontainers class CreateUserTests { diff --git a/data-redis-cache/build.gradle.kts b/data-redis-cache/build.gradle.kts index 7cded78d..9dcc7b3e 100644 --- a/data-redis-cache/build.gradle.kts +++ b/data-redis-cache/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -23,9 +23,10 @@ dependencies { runtimeOnly("org.postgresql:postgresql") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:postgresql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-postgresql") testImplementation("com.redis:testcontainers-redis") + testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/data-redis-cache/src/test/java/zin/rashidi/dataredis/cache/TestcontainersConfiguration.java b/data-redis-cache/src/test/java/zin/rashidi/dataredis/cache/TestcontainersConfiguration.java index 9c5bfa07..a6096101 100644 --- a/data-redis-cache/src/test/java/zin/rashidi/dataredis/cache/TestcontainersConfiguration.java +++ b/data-redis-cache/src/test/java/zin/rashidi/dataredis/cache/TestcontainersConfiguration.java @@ -4,7 +4,7 @@ import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; -import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.postgresql.PostgreSQLContainer; import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) @@ -12,8 +12,8 @@ public class TestcontainersConfiguration { @Bean @ServiceConnection - PostgreSQLContainer postgresContainer() { - return new PostgreSQLContainer<>(DockerImageName.parse("postgres:latest")); + PostgreSQLContainer postgresContainer() { + return new PostgreSQLContainer(DockerImageName.parse("postgres:latest")); } @Bean diff --git a/data-redis-cache/src/test/java/zin/rashidi/dataredis/cache/customer/CustomerRepositoryTests.java b/data-redis-cache/src/test/java/zin/rashidi/dataredis/cache/customer/CustomerRepositoryTests.java index 2d971d2e..5c8a51f6 100644 --- a/data-redis-cache/src/test/java/zin/rashidi/dataredis/cache/customer/CustomerRepositoryTests.java +++ b/data-redis-cache/src/test/java/zin/rashidi/dataredis/cache/customer/CustomerRepositoryTests.java @@ -4,9 +4,9 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; -import org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration; +import org.springframework.boot.cache.autoconfigure.CacheAutoConfiguration; import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.data.jpa.test.autoconfigure.DataJpaTest; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.ComponentScan.Filter; diff --git a/data-repository-definition/build.gradle.kts b/data-repository-definition/build.gradle.kts index da037a33..aee96243 100644 --- a/data-repository-definition/build.gradle.kts +++ b/data-repository-definition/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -22,8 +22,8 @@ dependencies { runtimeOnly("org.postgresql:postgresql") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:postgresql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-postgresql") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/data-repository-definition/src/test/java/zin/rashidi/data/repositorydefinition/TestcontainersConfiguration.java b/data-repository-definition/src/test/java/zin/rashidi/data/repositorydefinition/TestcontainersConfiguration.java index 53dc6aa5..07d88da0 100644 --- a/data-repository-definition/src/test/java/zin/rashidi/data/repositorydefinition/TestcontainersConfiguration.java +++ b/data-repository-definition/src/test/java/zin/rashidi/data/repositorydefinition/TestcontainersConfiguration.java @@ -3,7 +3,7 @@ import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; -import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.postgresql.PostgreSQLContainer; import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) @@ -11,8 +11,8 @@ public class TestcontainersConfiguration { @Bean @ServiceConnection - PostgreSQLContainer postgresContainer() { - return new PostgreSQLContainer<>(DockerImageName.parse("postgres:latest")); + PostgreSQLContainer postgresContainer() { + return new PostgreSQLContainer(DockerImageName.parse("postgres:latest")); } } diff --git a/data-rest-composite-id/build.gradle.kts b/data-rest-composite-id/build.gradle.kts index 344efc23..db3ef48c 100644 --- a/data-rest-composite-id/build.gradle.kts +++ b/data-rest-composite-id/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -22,9 +22,10 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-data-rest") runtimeOnly("org.postgresql:postgresql") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-starter-webmvc-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:postgresql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-postgresql") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/data-rest-composite-id/src/main/java/zin/rashidi/datarest/compositeid/book/Author.java b/data-rest-composite-id/src/main/java/zin/rashidi/datarest/compositeid/book/Author.java index ba75e7d8..c1836b03 100644 --- a/data-rest-composite-id/src/main/java/zin/rashidi/datarest/compositeid/book/Author.java +++ b/data-rest-composite-id/src/main/java/zin/rashidi/datarest/compositeid/book/Author.java @@ -19,7 +19,6 @@ class Author { @Embeddable static class Id implements Serializable { - @GeneratedValue private Long id; public Long id() { diff --git a/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/TestcontainersConfiguration.java b/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/TestcontainersConfiguration.java index 8de66d22..687287cf 100644 --- a/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/TestcontainersConfiguration.java +++ b/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/TestcontainersConfiguration.java @@ -3,7 +3,7 @@ import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; -import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.postgresql.PostgreSQLContainer; import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) @@ -11,8 +11,8 @@ public class TestcontainersConfiguration { @Bean @ServiceConnection - PostgreSQLContainer postgresContainer() { - return new PostgreSQLContainer<>(DockerImageName.parse("postgres:latest")); + PostgreSQLContainer postgresContainer() { + return new PostgreSQLContainer(DockerImageName.parse("postgres:latest")); } } diff --git a/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/book/CreateAuthorTests.java b/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/book/CreateAuthorTests.java index ab75b0e2..43a10ec6 100644 --- a/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/book/CreateAuthorTests.java +++ b/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/book/CreateAuthorTests.java @@ -4,7 +4,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; import org.springframework.test.web.servlet.assertj.MockMvcTester; diff --git a/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/book/CreateBookTests.java b/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/book/CreateBookTests.java index bf9a2637..c601a875 100644 --- a/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/book/CreateBookTests.java +++ b/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/book/CreateBookTests.java @@ -3,7 +3,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; import org.springframework.test.context.jdbc.Sql; diff --git a/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/book/GetBookTests.java b/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/book/GetBookTests.java index da81f84d..b20e6733 100644 --- a/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/book/GetBookTests.java +++ b/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/book/GetBookTests.java @@ -3,7 +3,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; import org.springframework.test.context.jdbc.Sql; diff --git a/data-rest-validation/build.gradle.kts b/data-rest-validation/build.gradle.kts index 429c4cc9..e5c4a08f 100644 --- a/data-rest-validation/build.gradle.kts +++ b/data-rest-validation/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -22,11 +22,12 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-data-mongodb") implementation("org.springframework.boot:spring-boot-starter-data-rest") runtimeOnly("com.mysql:mysql-connector-j") + testImplementation("org.springframework.boot:spring-boot-resttestclient") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:mongodb") - testImplementation("org.testcontainers:mysql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-mongodb") + testImplementation("org.testcontainers:testcontainers-mysql") } tasks.named("test") { diff --git a/data-rest-validation/src/test/java/zin/rashidi/boot/data/rest/TestDataRestValidationApplication.java b/data-rest-validation/src/test/java/zin/rashidi/boot/data/rest/TestDataRestValidationApplication.java index d64dbe7e..ad063386 100644 --- a/data-rest-validation/src/test/java/zin/rashidi/boot/data/rest/TestDataRestValidationApplication.java +++ b/data-rest-validation/src/test/java/zin/rashidi/boot/data/rest/TestDataRestValidationApplication.java @@ -4,8 +4,8 @@ import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; -import org.testcontainers.containers.MongoDBContainer; -import org.testcontainers.containers.MySQLContainer; +import org.testcontainers.mongodb.MongoDBContainer; +import org.testcontainers.mysql.MySQLContainer; import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) @@ -19,8 +19,8 @@ MongoDBContainer mongoDbContainer() { @Bean @ServiceConnection - MySQLContainer mysqlContainer() { - return new MySQLContainer<>(DockerImageName.parse("mysql:lts")); + MySQLContainer mysqlContainer() { + return new MySQLContainer(DockerImageName.parse("mysql:lts")); } public static void main(String[] args) { diff --git a/data-rest-validation/src/test/java/zin/rashidi/boot/data/rest/book/CreateBookTests.java b/data-rest-validation/src/test/java/zin/rashidi/boot/data/rest/book/CreateBookTests.java index 2bc17a61..f8dfea3d 100644 --- a/data-rest-validation/src/test/java/zin/rashidi/boot/data/rest/book/CreateBookTests.java +++ b/data-rest-validation/src/test/java/zin/rashidi/boot/data/rest/book/CreateBookTests.java @@ -13,8 +13,9 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.resttestclient.autoconfigure.AutoConfigureTestRestTemplate; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.resttestclient.TestRestTemplate; import org.springframework.context.annotation.Import; import org.springframework.data.rest.webmvc.support.RepositoryConstraintViolationExceptionMessage.ValidationError; import org.springframework.http.HttpEntity; @@ -25,6 +26,7 @@ /** * @author Rashidi Zin */ +@AutoConfigureTestRestTemplate @Import(TestDataRestValidationApplication.class) @SpringBootTest(webEnvironment = RANDOM_PORT, properties = "spring.jpa.hibernate.ddl-auto=create-drop") class CreateBookTests { diff --git a/graphql/build.gradle.kts b/graphql/build.gradle.kts index d41f2071..91721209 100644 --- a/graphql/build.gradle.kts +++ b/graphql/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -20,7 +20,7 @@ repositories { dependencies { implementation("com.graphql-java:graphql-java-extended-scalars:24.0") implementation("org.springframework.boot:spring-boot-starter-graphql") - implementation("org.springframework.boot:spring-boot-starter-web") + implementation("org.springframework.boot:spring-boot-starter-webmvc") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework:spring-webflux") testImplementation("org.springframework.graphql:spring-graphql-test") diff --git a/jooq/build.gradle.kts b/jooq/build.gradle.kts index 2ae28a05..328af4b7 100644 --- a/jooq/build.gradle.kts +++ b/jooq/build.gradle.kts @@ -3,7 +3,7 @@ import org.jooq.meta.kotlin.* plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" id("nu.studer.jooq") version "10.2" } @@ -28,8 +28,8 @@ dependencies { runtimeOnly("com.mysql:mysql-connector-j") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:mysql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-mysql") } dependencyManagement { diff --git a/jooq/src/test/java/zin/rashidi/boot/jooq/TestJooqApplication.java b/jooq/src/test/java/zin/rashidi/boot/jooq/TestJooqApplication.java index 7fed606d..7fce3bb8 100644 --- a/jooq/src/test/java/zin/rashidi/boot/jooq/TestJooqApplication.java +++ b/jooq/src/test/java/zin/rashidi/boot/jooq/TestJooqApplication.java @@ -4,7 +4,7 @@ import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; -import org.testcontainers.containers.MySQLContainer; +import org.testcontainers.mysql.MySQLContainer; import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) @@ -16,8 +16,8 @@ public static void main(String[] args) { @Bean @ServiceConnection - MySQLContainer mysqlContainer() { - return new MySQLContainer<>(DockerImageName.parse("mysql:lts")); + MySQLContainer mysqlContainer() { + return new MySQLContainer(DockerImageName.parse("mysql:lts")); } } diff --git a/jooq/src/test/java/zin/rashidi/boot/jooq/user/UserRepositoryTests.java b/jooq/src/test/java/zin/rashidi/boot/jooq/user/UserRepositoryTests.java index 3bd5e91a..41135db2 100644 --- a/jooq/src/test/java/zin/rashidi/boot/jooq/user/UserRepositoryTests.java +++ b/jooq/src/test/java/zin/rashidi/boot/jooq/user/UserRepositoryTests.java @@ -8,9 +8,9 @@ import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.stereotype.Repository; import org.springframework.test.context.jdbc.Sql; -import org.testcontainers.containers.MySQLContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mysql.MySQLContainer; import static org.assertj.core.api.Assertions.assertThat; @@ -24,7 +24,7 @@ class UserRepositoryTests { @Container @ServiceConnection - private static final MySQLContainer container = new MySQLContainer<>("mysql:lts"); + private static final MySQLContainer container = new MySQLContainer("mysql:lts"); @Autowired private UserRepository repository; diff --git a/modulith/build.gradle.kts b/modulith/build.gradle.kts index e3be53c8..4cc0fe7e 100644 --- a/modulith/build.gradle.kts +++ b/modulith/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -18,7 +18,7 @@ repositories { } dependencies { - implementation(platform("org.springframework.modulith:spring-modulith-bom:1.4.4")) + implementation(platform("org.springframework.modulith:spring-modulith-bom:2.0.5")) implementation("org.springframework.boot:spring-boot-starter-data-jdbc") implementation("org.springframework.modulith:spring-modulith-starter-core") @@ -27,8 +27,8 @@ dependencies { testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.springframework.modulith:spring-modulith-starter-test") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:postgresql") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-postgresql") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/modulith/src/test/java/zin/rashidi/boot/modulith/TestcontainersConfiguration.java b/modulith/src/test/java/zin/rashidi/boot/modulith/TestcontainersConfiguration.java index 87c21c0c..059ed31a 100644 --- a/modulith/src/test/java/zin/rashidi/boot/modulith/TestcontainersConfiguration.java +++ b/modulith/src/test/java/zin/rashidi/boot/modulith/TestcontainersConfiguration.java @@ -3,7 +3,7 @@ import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; -import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.postgresql.PostgreSQLContainer; import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) @@ -11,8 +11,8 @@ public class TestcontainersConfiguration { @Bean @ServiceConnection - PostgreSQLContainer postgresContainer() { - return new PostgreSQLContainer<>(DockerImageName.parse("postgres:latest")) + PostgreSQLContainer postgresContainer() { + return new PostgreSQLContainer(DockerImageName.parse("postgres:latest")) .withInitScripts("schema.sql", "schema-data.sql"); } diff --git a/test-execution-listeners/build.gradle.kts b/test-execution-listeners/build.gradle.kts index 0a0874b9..c640ea4f 100644 --- a/test-execution-listeners/build.gradle.kts +++ b/test-execution-listeners/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -21,8 +21,8 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-data-mongodb") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:mongodb") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-mongodb") } tasks.named("test") { diff --git a/test-execution-listeners/src/test/java/zin/rashidi/boot/test/user/UserRepositoryTests.java b/test-execution-listeners/src/test/java/zin/rashidi/boot/test/user/UserRepositoryTests.java index 0a96596d..8e4cea0c 100644 --- a/test-execution-listeners/src/test/java/zin/rashidi/boot/test/user/UserRepositoryTests.java +++ b/test-execution-listeners/src/test/java/zin/rashidi/boot/test/user/UserRepositoryTests.java @@ -10,9 +10,9 @@ import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.test.context.TestExecutionListeners; -import org.testcontainers.containers.MongoDBContainer; import org.testcontainers.junit.jupiter.Container; -import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mongodb.MongoDBContainer; /** * @author Rashidi Zin diff --git a/test-rest-assured/build.gradle.kts b/test-rest-assured/build.gradle.kts index 7e676fb6..bedd8a5e 100644 --- a/test-rest-assured/build.gradle.kts +++ b/test-rest-assured/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -19,12 +19,13 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter-data-mongodb") - implementation("org.springframework.boot:spring-boot-starter-web") + implementation("org.springframework.boot:spring-boot-starter-webmvc") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:mongodb") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-mongodb") testImplementation("io.rest-assured:rest-assured") + testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4.4") } tasks.named("test") { diff --git a/test-rest-assured/src/main/java/zin/rashidi/boot/test/restassured/user/UserReadOnly.java b/test-rest-assured/src/main/java/zin/rashidi/boot/test/restassured/user/UserReadOnly.java index 212e67df..2f4d914d 100644 --- a/test-rest-assured/src/main/java/zin/rashidi/boot/test/restassured/user/UserReadOnly.java +++ b/test-rest-assured/src/main/java/zin/rashidi/boot/test/restassured/user/UserReadOnly.java @@ -2,8 +2,8 @@ import org.bson.types.ObjectId; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import tools.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.ser.std.ToStringSerializer; /** * @author Rashidi Zin diff --git a/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/TestTestRestAssuredApplication.java b/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/TestTestRestAssuredApplication.java index aa7bcb9c..915094cb 100644 --- a/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/TestTestRestAssuredApplication.java +++ b/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/TestTestRestAssuredApplication.java @@ -4,7 +4,7 @@ import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; -import org.testcontainers.containers.MongoDBContainer; +import org.testcontainers.mongodb.MongoDBContainer; import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) diff --git a/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/user/CreateUserTests.java b/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/user/CreateUserTests.java index 4390145f..0afdd1ae 100644 --- a/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/user/CreateUserTests.java +++ b/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/user/CreateUserTests.java @@ -8,14 +8,14 @@ import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.test.context.TestExecutionListeners; -import org.testcontainers.containers.MongoDBContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mongodb.MongoDBContainer; import static io.restassured.RestAssured.given; import static io.restassured.http.ContentType.JSON; -import static org.apache.http.HttpStatus.SC_BAD_REQUEST; -import static org.apache.http.HttpStatus.SC_CREATED; +import static org.apache.hc.core5.http.HttpStatus.SC_BAD_REQUEST; +import static org.apache.hc.core5.http.HttpStatus.SC_CREATED; import static org.hamcrest.Matchers.equalTo; import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; import static org.springframework.test.context.TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS; diff --git a/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/user/DeleteUserTests.java b/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/user/DeleteUserTests.java index 589c5f71..6f9407ee 100644 --- a/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/user/DeleteUserTests.java +++ b/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/user/DeleteUserTests.java @@ -8,14 +8,14 @@ import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.test.context.TestExecutionListeners; -import org.testcontainers.containers.MongoDBContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mongodb.MongoDBContainer; import static io.restassured.RestAssured.get; import static io.restassured.RestAssured.when; -import static org.apache.http.HttpStatus.SC_NOT_FOUND; -import static org.apache.http.HttpStatus.SC_NO_CONTENT; +import static org.apache.hc.core5.http.HttpStatus.SC_NOT_FOUND; +import static org.apache.hc.core5.http.HttpStatus.SC_NO_CONTENT; import static org.hamcrest.Matchers.equalTo; import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; import static org.springframework.test.context.TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS; diff --git a/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/user/FindUserByUsernameTests.java b/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/user/FindUserByUsernameTests.java index 758c8b87..3a328286 100644 --- a/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/user/FindUserByUsernameTests.java +++ b/test-rest-assured/src/test/java/zin/rashidi/boot/test/restassured/user/FindUserByUsernameTests.java @@ -8,14 +8,14 @@ import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.test.context.TestExecutionListeners; -import org.testcontainers.containers.MongoDBContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.mongodb.MongoDBContainer; import static io.restassured.RestAssured.given; import static io.restassured.http.ContentType.JSON; -import static org.apache.http.HttpStatus.SC_NOT_FOUND; -import static org.apache.http.HttpStatus.SC_OK; +import static org.apache.hc.core5.http.HttpStatus.SC_NOT_FOUND; +import static org.apache.hc.core5.http.HttpStatus.SC_OK; import static org.hamcrest.Matchers.equalTo; import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; import static org.springframework.test.context.TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS; diff --git a/test-slice-tests-rest/build.gradle.kts b/test-slice-tests-rest/build.gradle.kts index 695922fa..b2de0f69 100644 --- a/test-slice-tests-rest/build.gradle.kts +++ b/test-slice-tests-rest/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -19,15 +19,17 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter-data-jpa") - implementation("org.springframework.boot:spring-boot-starter-web") + implementation("org.springframework.boot:spring-boot-starter-webmvc") implementation("org.springframework.boot:spring-boot-starter-security") - testImplementation("org.springframework.security:spring-security-test") + testImplementation("org.springframework.boot:spring-boot-starter-security-test") runtimeOnly("org.postgresql:postgresql") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-starter-webmvc-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.springframework.batch:spring-batch-test") - testImplementation("org.testcontainers:junit-jupiter") - testImplementation("org.testcontainers:postgresql") + testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test") + testImplementation("org.testcontainers:testcontainers-junit-jupiter") + testImplementation("org.testcontainers:testcontainers-postgresql") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/TestcontainersConfiguration.java b/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/TestcontainersConfiguration.java index 473caa72..ce7fae89 100644 --- a/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/TestcontainersConfiguration.java +++ b/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/TestcontainersConfiguration.java @@ -3,7 +3,7 @@ import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; -import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.postgresql.PostgreSQLContainer; import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) @@ -11,8 +11,8 @@ public class TestcontainersConfiguration { @Bean @ServiceConnection - PostgreSQLContainer postgresContainer() { - return new PostgreSQLContainer<>(DockerImageName.parse("postgres:latest")); + PostgreSQLContainer postgresContainer() { + return new PostgreSQLContainer(DockerImageName.parse("postgres:latest")); } } diff --git a/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/user/FindByUsernameTests.java b/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/user/FindByUsernameTests.java index dad878a1..6051dd24 100644 --- a/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/user/FindByUsernameTests.java +++ b/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/user/FindByUsernameTests.java @@ -3,8 +3,9 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.resttestclient.autoconfigure.AutoConfigureTestRestTemplate; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.resttestclient.TestRestTemplate; import org.springframework.context.annotation.Import; import org.springframework.test.context.jdbc.Sql; import zin.rashidi.boot.test.slices.TestcontainersConfiguration; @@ -18,6 +19,7 @@ /** * @author Rashidi Zin */ +@AutoConfigureTestRestTemplate @Import(TestcontainersConfiguration.class) @SpringBootTest(webEnvironment = RANDOM_PORT, properties = { "spring.jpa.hibernate.ddl-auto=create-drop", diff --git a/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/user/UserRepositoryTests.java b/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/user/UserRepositoryTests.java index 37da6957..0959ebfa 100644 --- a/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/user/UserRepositoryTests.java +++ b/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/user/UserRepositoryTests.java @@ -3,12 +3,12 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.data.jpa.test.autoconfigure.DataJpaTest; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.test.context.jdbc.Sql; -import org.testcontainers.containers.PostgreSQLContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.postgresql.PostgreSQLContainer; import org.testcontainers.utility.DockerImageName; import static org.assertj.core.api.Assertions.assertThat; @@ -23,7 +23,7 @@ class UserRepositoryTests { @Container @ServiceConnection - private static final PostgreSQLContainer postgresql = new PostgreSQLContainer<>(DockerImageName.parse("postgres:latest")); + private static final PostgreSQLContainer postgresql = new PostgreSQLContainer(DockerImageName.parse("postgres:latest")); @Autowired private UserRepository repository; diff --git a/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/user/UserResourceTests.java b/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/user/UserResourceTests.java index 95fd4195..03377ab9 100644 --- a/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/user/UserResourceTests.java +++ b/test-slice-tests-rest/src/test/java/zin/rashidi/boot/test/slices/user/UserResourceTests.java @@ -4,7 +4,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.test.context.support.WithMockUser; diff --git a/web-rest-client/build.gradle.kts b/web-rest-client/build.gradle.kts index 2f025664..e4f2d3a7 100644 --- a/web-rest-client/build.gradle.kts +++ b/web-rest-client/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -18,7 +18,9 @@ repositories { } dependencies { - implementation("org.springframework.boot:spring-boot-starter-web") + implementation("org.springframework.boot:spring-boot-starter-restclient") + implementation("org.springframework.boot:spring-boot-starter-webmvc") + testImplementation("org.springframework.boot:spring-boot-starter-restclient-test") testImplementation("org.springframework.boot:spring-boot-starter-test") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/web-rest-client/src/test/java/zin/rashidi/boot/web/restclient/post/PostRepositoryTests.java b/web-rest-client/src/test/java/zin/rashidi/boot/web/restclient/post/PostRepositoryTests.java index fee5faa8..3d3473b2 100644 --- a/web-rest-client/src/test/java/zin/rashidi/boot/web/restclient/post/PostRepositoryTests.java +++ b/web-rest-client/src/test/java/zin/rashidi/boot/web/restclient/post/PostRepositoryTests.java @@ -1,13 +1,13 @@ package zin.rashidi.boot.web.restclient.post; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.client.RestClientTest; +import org.springframework.boot.restclient.test.autoconfigure.RestClientTest; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.test.web.client.MockRestServiceServer; +import tools.jackson.core.JacksonException; import zin.rashidi.boot.web.restclient.post.PostRepositoryConfiguration.PostErrorResponseHandler.PostNotFoundException; import java.util.List; @@ -36,7 +36,7 @@ class PostRepositoryTests { @Test @DisplayName("When requesting for all posts then response should contain all posts available") - void findAll() throws JsonProcessingException { + void findAll() throws JacksonException { var content = mapper.writeValueAsString(posts()); mockServer.expect(requestTo("https://jsonplaceholder.typicode.com/posts")).andRespond(withSuccess(content, APPLICATION_JSON)); @@ -48,7 +48,7 @@ void findAll() throws JsonProcessingException { @Test @DisplayName("Given a post with requested id is available When requested Then a post with the id should be returned") - void findById() throws JsonProcessingException { + void findById() throws JacksonException { var content = mapper.writeValueAsString(new Post(1L, 84L, "Spring Web: REST Clients Example with RESTClient", "An example of using RESTClient")); mockServer.expect(requestTo("https://jsonplaceholder.typicode.com/posts/1")).andRespond(withSuccess(content, APPLICATION_JSON)); diff --git a/web-rest-client/src/test/java/zin/rashidi/boot/web/restclient/user/UserRepositoryTests.java b/web-rest-client/src/test/java/zin/rashidi/boot/web/restclient/user/UserRepositoryTests.java index 680edddb..5f807baf 100644 --- a/web-rest-client/src/test/java/zin/rashidi/boot/web/restclient/user/UserRepositoryTests.java +++ b/web-rest-client/src/test/java/zin/rashidi/boot/web/restclient/user/UserRepositoryTests.java @@ -1,12 +1,12 @@ package zin.rashidi.boot.web.restclient.user; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.client.RestClientTest; +import org.springframework.boot.restclient.test.autoconfigure.RestClientTest; import org.springframework.test.web.client.MockRestServiceServer; +import tools.jackson.core.JacksonException; import zin.rashidi.boot.web.restclient.user.UserRestRepository.UserNotFoundException; import java.net.URI; @@ -36,7 +36,7 @@ class UserRepositoryTests { @Test @DisplayName("When findAll Then all users should be returned") - void findAll() throws JsonProcessingException { + void findAll() throws JacksonException { var response = mapper.writeValueAsString(List.of( new User(84L, "Rashidi Zin", "rashidi.zin", "rashidi@zin.my", URI.create("rashidi.zin.my")), new User(87L, "Zaid Zin", "zaid.zin", "zaid@zin.my", URI.create("zaid.zin.my")) @@ -51,7 +51,7 @@ void findAll() throws JsonProcessingException { @Test @DisplayName("When an id is provided Then user with the id should be returned") - void findById() throws JsonProcessingException { + void findById() throws JacksonException { var response = mapper.writeValueAsString( new User(84L, "Rashidi Zin", "rashidi.zin", "rashidi@zin.my", URI.create("rashidi.zin.my")) ); diff --git a/web-thymeleaf-xss/build.gradle.kts b/web-thymeleaf-xss/build.gradle.kts index 838b5453..5dfba683 100644 --- a/web-thymeleaf-xss/build.gradle.kts +++ b/web-thymeleaf-xss/build.gradle.kts @@ -1,6 +1,6 @@ plugins { java - id("org.springframework.boot") version "3.5.7" + id("org.springframework.boot") version "4.0.5" id("io.spring.dependency-management") version "1.1.7" } @@ -20,10 +20,11 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter-security") implementation("org.springframework.boot:spring-boot-starter-thymeleaf") - implementation("org.springframework.boot:spring-boot-starter-web") - implementation("org.thymeleaf.extras:thymeleaf-extras-springsecurity6") + implementation("org.springframework.boot:spring-boot-starter-webmvc") + implementation("org.thymeleaf.extras:thymeleaf-extras-springsecurity7") testImplementation("org.springframework.boot:spring-boot-starter-test") - testImplementation("org.springframework.security:spring-security-test") + testImplementation("org.springframework.boot:spring-boot-starter-webmvc-test") + testImplementation("org.springframework.boot:spring-boot-starter-security-test") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/web-thymeleaf-xss/src/test/java/zin/rashidi/web/xss/greet/GreetResourceTests.java b/web-thymeleaf-xss/src/test/java/zin/rashidi/web/xss/greet/GreetResourceTests.java index 4e6b3615..0228669c 100644 --- a/web-thymeleaf-xss/src/test/java/zin/rashidi/web/xss/greet/GreetResourceTests.java +++ b/web-thymeleaf-xss/src/test/java/zin/rashidi/web/xss/greet/GreetResourceTests.java @@ -3,7 +3,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.test.web.servlet.assertj.MockMvcTester; From d2d2f6e954703e81184f34be5bb3523524b9ffc2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 18 Apr 2026 07:48:39 +0000 Subject: [PATCH 07/23] Add Spring Boot 4.0 modular test dependencies to subprojects Spring Boot 4.0 split test autoconfigure annotations into separate modules. Add the corresponding modular test module as a testImplementation dependency to each subproject that uses a test slice annotation. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: rashidi <380073+rashidi@users.noreply.github.com> --- batch-rest-repository/build.gradle.kts | 1 + .../rashidi/boot/batch/rest/user/UserJobConfiguration.java | 4 +--- .../zin/rashidi/boot/batch/rest/user/UserBatchJobTests.java | 4 ++-- .../zin/rashidi/boot/batch/user/UserJobConfiguration.java | 3 +-- .../java/zin/rashidi/boot/batch/user/UserBatchJobTests.java | 4 ++-- data-jdbc-audit/build.gradle.kts | 1 + data-jdbc-schema-generation/build.gradle.kts | 1 + data-jpa-audit/build.gradle.kts | 1 + data-jpa-event/build.gradle.kts | 1 + data-jpa-filtered-query/build.gradle.kts | 1 + data-jpa-hibernate-cache/build.gradle.kts | 1 + data-mongodb-audit/build.gradle.kts | 1 + data-mongodb-full-text-search/build.gradle.kts | 1 + data-mongodb-tc-data-load/build.gradle.kts | 1 + data-redis-cache/build.gradle.kts | 1 + data-repository-definition/build.gradle.kts | 1 + graphql/build.gradle.kts | 1 + jooq/build.gradle.kts | 1 + test-execution-listeners/build.gradle.kts | 1 + test-slice-tests-rest/build.gradle.kts | 2 ++ web-rest-client/build.gradle.kts | 1 + web-thymeleaf-xss/build.gradle.kts | 3 ++- 22 files changed, 26 insertions(+), 10 deletions(-) diff --git a/batch-rest-repository/build.gradle.kts b/batch-rest-repository/build.gradle.kts index 9ef5fbdd..37b05d5a 100644 --- a/batch-rest-repository/build.gradle.kts +++ b/batch-rest-repository/build.gradle.kts @@ -23,6 +23,7 @@ dependencies { implementation("tools.jackson.core:jackson-databind") runtimeOnly("com.mysql:mysql-connector-j") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-jdbc") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.springframework.batch:spring-batch-test") testImplementation("org.testcontainers:testcontainers-junit-jupiter") diff --git a/batch-rest-repository/src/main/java/zin/rashidi/boot/batch/rest/user/UserJobConfiguration.java b/batch-rest-repository/src/main/java/zin/rashidi/boot/batch/rest/user/UserJobConfiguration.java index 4c9f7e85..a5aaeec7 100644 --- a/batch-rest-repository/src/main/java/zin/rashidi/boot/batch/rest/user/UserJobConfiguration.java +++ b/batch-rest-repository/src/main/java/zin/rashidi/boot/batch/rest/user/UserJobConfiguration.java @@ -18,15 +18,13 @@ import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.transaction.PlatformTransactionManager; -import tools.jackson.databind.ObjectMapper; - /** * @author Rashidi Zin */ @Configuration class UserJobConfiguration { - private static final ObjectMapper OBJECT_MAPPER = new JsonMapper(); + private static final JsonMapper OBJECT_MAPPER = new JsonMapper(); private final JobRepository jobRepository; private final PlatformTransactionManager transactionManager; diff --git a/batch-rest-repository/src/test/java/zin/rashidi/boot/batch/rest/user/UserBatchJobTests.java b/batch-rest-repository/src/test/java/zin/rashidi/boot/batch/rest/user/UserBatchJobTests.java index 34bf61e7..bed5db13 100644 --- a/batch-rest-repository/src/test/java/zin/rashidi/boot/batch/rest/user/UserBatchJobTests.java +++ b/batch-rest-repository/src/test/java/zin/rashidi/boot/batch/rest/user/UserBatchJobTests.java @@ -4,7 +4,7 @@ import com.mongodb.MongoClientSettings; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.springframework.batch.core.configuration.support.DefaultBatchConfiguration; +import org.springframework.batch.core.configuration.support.JdbcDefaultBatchConfiguration; import org.springframework.batch.core.job.JobExecution; import org.springframework.batch.test.JobLauncherTestUtils; import org.springframework.batch.test.context.SpringBatchTest; @@ -72,7 +72,7 @@ void launch() { } @TestConfiguration - static class BatchTestConfiguration extends DefaultBatchConfiguration { + static class BatchTestConfiguration extends JdbcDefaultBatchConfiguration { @Override protected DataSource getDataSource() { diff --git a/batch-skip-step/src/main/java/zin/rashidi/boot/batch/user/UserJobConfiguration.java b/batch-skip-step/src/main/java/zin/rashidi/boot/batch/user/UserJobConfiguration.java index 91d10847..bcd6c161 100644 --- a/batch-skip-step/src/main/java/zin/rashidi/boot/batch/user/UserJobConfiguration.java +++ b/batch-skip-step/src/main/java/zin/rashidi/boot/batch/user/UserJobConfiguration.java @@ -1,6 +1,5 @@ package zin.rashidi.boot.batch.user; -import tools.jackson.databind.ObjectMapper; import tools.jackson.databind.json.JsonMapper; import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; @@ -26,7 +25,7 @@ @Configuration class UserJobConfiguration { - private static final ObjectMapper OBJECT_MAPPER = new JsonMapper(); + private static final JsonMapper OBJECT_MAPPER = new JsonMapper(); private JsonItemReader reader() { JacksonJsonObjectReader reader = new JacksonJsonObjectReader<>(UserFile.class); diff --git a/batch-skip-step/src/test/java/zin/rashidi/boot/batch/user/UserBatchJobTests.java b/batch-skip-step/src/test/java/zin/rashidi/boot/batch/user/UserBatchJobTests.java index 40136301..d02a02aa 100644 --- a/batch-skip-step/src/test/java/zin/rashidi/boot/batch/user/UserBatchJobTests.java +++ b/batch-skip-step/src/test/java/zin/rashidi/boot/batch/user/UserBatchJobTests.java @@ -3,7 +3,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.springframework.batch.core.configuration.support.DefaultBatchConfiguration; +import org.springframework.batch.core.configuration.support.JdbcDefaultBatchConfiguration; import org.springframework.batch.core.job.JobExecution; import org.springframework.batch.test.JobLauncherTestUtils; import org.springframework.batch.test.context.SpringBatchTest; @@ -112,7 +112,7 @@ void truncateUsers() { } @TestConfiguration - static class BatchTestConfiguration extends DefaultBatchConfiguration { + static class BatchTestConfiguration extends JdbcDefaultBatchConfiguration { @Override @Bean diff --git a/data-jdbc-audit/build.gradle.kts b/data-jdbc-audit/build.gradle.kts index b79cf7fb..93d69db3 100644 --- a/data-jdbc-audit/build.gradle.kts +++ b/data-jdbc-audit/build.gradle.kts @@ -21,6 +21,7 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-data-jdbc") runtimeOnly("org.postgresql:postgresql") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-data-jdbc-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.testcontainers:testcontainers-junit-jupiter") testImplementation("org.testcontainers:testcontainers-postgresql") diff --git a/data-jdbc-schema-generation/build.gradle.kts b/data-jdbc-schema-generation/build.gradle.kts index 54e22b55..dc973e3f 100644 --- a/data-jdbc-schema-generation/build.gradle.kts +++ b/data-jdbc-schema-generation/build.gradle.kts @@ -22,6 +22,7 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-liquibase") runtimeOnly("org.postgresql:postgresql") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-data-jdbc-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.testcontainers:testcontainers-junit-jupiter") testImplementation("org.testcontainers:testcontainers-postgresql") diff --git a/data-jpa-audit/build.gradle.kts b/data-jpa-audit/build.gradle.kts index e18df045..87729711 100644 --- a/data-jpa-audit/build.gradle.kts +++ b/data-jpa-audit/build.gradle.kts @@ -22,6 +22,7 @@ dependencies { runtimeOnly("com.mysql:mysql-connector-j") testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-data-jpa-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.testcontainers:testcontainers-junit-jupiter") testImplementation("org.testcontainers:testcontainers-mysql") diff --git a/data-jpa-event/build.gradle.kts b/data-jpa-event/build.gradle.kts index 2f21e37e..11973788 100644 --- a/data-jpa-event/build.gradle.kts +++ b/data-jpa-event/build.gradle.kts @@ -22,6 +22,7 @@ dependencies { runtimeOnly("org.postgresql:postgresql") testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-data-jpa-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.testcontainers:testcontainers-junit-jupiter") testImplementation("org.testcontainers:testcontainers-postgresql") diff --git a/data-jpa-filtered-query/build.gradle.kts b/data-jpa-filtered-query/build.gradle.kts index e18df045..87729711 100644 --- a/data-jpa-filtered-query/build.gradle.kts +++ b/data-jpa-filtered-query/build.gradle.kts @@ -22,6 +22,7 @@ dependencies { runtimeOnly("com.mysql:mysql-connector-j") testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-data-jpa-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.testcontainers:testcontainers-junit-jupiter") testImplementation("org.testcontainers:testcontainers-mysql") diff --git a/data-jpa-hibernate-cache/build.gradle.kts b/data-jpa-hibernate-cache/build.gradle.kts index 17aec68e..57b88d24 100644 --- a/data-jpa-hibernate-cache/build.gradle.kts +++ b/data-jpa-hibernate-cache/build.gradle.kts @@ -24,6 +24,7 @@ dependencies { runtimeOnly("org.postgresql:postgresql") testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-data-jpa-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.testcontainers:testcontainers-junit-jupiter") testImplementation("org.testcontainers:testcontainers-postgresql") diff --git a/data-mongodb-audit/build.gradle.kts b/data-mongodb-audit/build.gradle.kts index c640ea4f..305d8adc 100644 --- a/data-mongodb-audit/build.gradle.kts +++ b/data-mongodb-audit/build.gradle.kts @@ -20,6 +20,7 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter-data-mongodb") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-data-mongodb-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.testcontainers:testcontainers-junit-jupiter") testImplementation("org.testcontainers:testcontainers-mongodb") diff --git a/data-mongodb-full-text-search/build.gradle.kts b/data-mongodb-full-text-search/build.gradle.kts index c640ea4f..305d8adc 100644 --- a/data-mongodb-full-text-search/build.gradle.kts +++ b/data-mongodb-full-text-search/build.gradle.kts @@ -20,6 +20,7 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter-data-mongodb") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-data-mongodb-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.testcontainers:testcontainers-junit-jupiter") testImplementation("org.testcontainers:testcontainers-mongodb") diff --git a/data-mongodb-tc-data-load/build.gradle.kts b/data-mongodb-tc-data-load/build.gradle.kts index 088dfdd5..4c1004a1 100644 --- a/data-mongodb-tc-data-load/build.gradle.kts +++ b/data-mongodb-tc-data-load/build.gradle.kts @@ -20,6 +20,7 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter-data-mongodb") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-data-mongodb-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.testcontainers:testcontainers-junit-jupiter") testImplementation("org.testcontainers:testcontainers-mongodb") diff --git a/data-redis-cache/build.gradle.kts b/data-redis-cache/build.gradle.kts index 9dcc7b3e..f16bd4e6 100644 --- a/data-redis-cache/build.gradle.kts +++ b/data-redis-cache/build.gradle.kts @@ -22,6 +22,7 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-data-redis") runtimeOnly("org.postgresql:postgresql") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-data-jpa-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.testcontainers:testcontainers-junit-jupiter") testImplementation("org.testcontainers:testcontainers-postgresql") diff --git a/data-repository-definition/build.gradle.kts b/data-repository-definition/build.gradle.kts index aee96243..4e3f36bd 100644 --- a/data-repository-definition/build.gradle.kts +++ b/data-repository-definition/build.gradle.kts @@ -21,6 +21,7 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-data-jdbc") runtimeOnly("org.postgresql:postgresql") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-data-jdbc-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.testcontainers:testcontainers-junit-jupiter") testImplementation("org.testcontainers:testcontainers-postgresql") diff --git a/graphql/build.gradle.kts b/graphql/build.gradle.kts index 91721209..415cb14f 100644 --- a/graphql/build.gradle.kts +++ b/graphql/build.gradle.kts @@ -22,6 +22,7 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-graphql") implementation("org.springframework.boot:spring-boot-starter-webmvc") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-graphql-test") testImplementation("org.springframework:spring-webflux") testImplementation("org.springframework.graphql:spring-graphql-test") } diff --git a/jooq/build.gradle.kts b/jooq/build.gradle.kts index 328af4b7..615338df 100644 --- a/jooq/build.gradle.kts +++ b/jooq/build.gradle.kts @@ -27,6 +27,7 @@ dependencies { jooqGenerator("com.mysql:mysql-connector-j") runtimeOnly("com.mysql:mysql-connector-j") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-jooq-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.testcontainers:testcontainers-junit-jupiter") testImplementation("org.testcontainers:testcontainers-mysql") diff --git a/test-execution-listeners/build.gradle.kts b/test-execution-listeners/build.gradle.kts index c640ea4f..305d8adc 100644 --- a/test-execution-listeners/build.gradle.kts +++ b/test-execution-listeners/build.gradle.kts @@ -20,6 +20,7 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter-data-mongodb") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-data-mongodb-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.testcontainers:testcontainers-junit-jupiter") testImplementation("org.testcontainers:testcontainers-mongodb") diff --git a/test-slice-tests-rest/build.gradle.kts b/test-slice-tests-rest/build.gradle.kts index b2de0f69..f1010ce9 100644 --- a/test-slice-tests-rest/build.gradle.kts +++ b/test-slice-tests-rest/build.gradle.kts @@ -24,6 +24,8 @@ dependencies { testImplementation("org.springframework.boot:spring-boot-starter-security-test") runtimeOnly("org.postgresql:postgresql") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-data-jpa-test") + testImplementation("org.springframework.boot:spring-boot-webmvc-test") testImplementation("org.springframework.boot:spring-boot-starter-webmvc-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.springframework.batch:spring-batch-test") diff --git a/web-rest-client/build.gradle.kts b/web-rest-client/build.gradle.kts index e4f2d3a7..5df6063a 100644 --- a/web-rest-client/build.gradle.kts +++ b/web-rest-client/build.gradle.kts @@ -22,6 +22,7 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-webmvc") testImplementation("org.springframework.boot:spring-boot-starter-restclient-test") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-restclient-test") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/web-thymeleaf-xss/build.gradle.kts b/web-thymeleaf-xss/build.gradle.kts index 5dfba683..cc889408 100644 --- a/web-thymeleaf-xss/build.gradle.kts +++ b/web-thymeleaf-xss/build.gradle.kts @@ -21,8 +21,9 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-security") implementation("org.springframework.boot:spring-boot-starter-thymeleaf") implementation("org.springframework.boot:spring-boot-starter-webmvc") - implementation("org.thymeleaf.extras:thymeleaf-extras-springsecurity7") + implementation("org.thymeleaf.extras:thymeleaf-extras-springsecurity6") testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.springframework.boot:spring-boot-webmvc-test") testImplementation("org.springframework.boot:spring-boot-starter-webmvc-test") testImplementation("org.springframework.boot:spring-boot-starter-security-test") testRuntimeOnly("org.junit.platform:junit-platform-launcher") From 079f5ab4718ea0377fcce74d30108a509cbfdc15 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 18 Apr 2026 07:54:33 +0000 Subject: [PATCH 08/23] Update test slice annotation imports for Spring Boot 4.0 Migrate imports to new packages: - DataJdbcTest -> org.springframework.boot.data.jdbc.test.autoconfigure - DataMongoTest -> org.springframework.boot.data.mongodb.test.autoconfigure - GraphQlTest -> org.springframework.boot.graphql.test.autoconfigure - JooqTest -> org.springframework.boot.jooq.test.autoconfigure DataJpaTest, WebMvcTest, and RestClientTest were already updated. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: rashidi <380073+rashidi@users.noreply.github.com> --- .../java/zin/rashidi/boot/data/jdbc/user/UserAuditTests.java | 2 +- .../zin/rashidi/boot/jdbcscgm/book/BookRepositoryTests.java | 2 +- .../java/zin/rashidi/boot/data/mongodb/user/UserAuditTests.java | 2 +- .../boot/data/mongodb/character/CharacterRepositoryTests.java | 2 +- .../data/mongodb/tc/dataload/user/UserRepositoryTests.java | 2 +- .../data/repositorydefinition/note/NoteRepositoryTests.java | 2 +- .../java/zin/rashidi/boot/graphql/book/BookResourceTests.java | 2 +- .../java/zin/rashidi/boot/jooq/user/UserRepositoryTests.java | 2 +- .../java/zin/rashidi/boot/test/user/UserRepositoryTests.java | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/data-jdbc-audit/src/test/java/zin/rashidi/boot/data/jdbc/user/UserAuditTests.java b/data-jdbc-audit/src/test/java/zin/rashidi/boot/data/jdbc/user/UserAuditTests.java index 341ee990..bf0b13f1 100644 --- a/data-jdbc-audit/src/test/java/zin/rashidi/boot/data/jdbc/user/UserAuditTests.java +++ b/data-jdbc-audit/src/test/java/zin/rashidi/boot/data/jdbc/user/UserAuditTests.java @@ -3,7 +3,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.data.jdbc.DataJdbcTest; +import org.springframework.boot.data.jdbc.test.autoconfigure.DataJdbcTest; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.data.jdbc.repository.config.EnableJdbcAuditing; diff --git a/data-jdbc-schema-generation/src/test/java/zin/rashidi/boot/jdbcscgm/book/BookRepositoryTests.java b/data-jdbc-schema-generation/src/test/java/zin/rashidi/boot/jdbcscgm/book/BookRepositoryTests.java index 1dc3b6c7..68cfc6be 100644 --- a/data-jdbc-schema-generation/src/test/java/zin/rashidi/boot/jdbcscgm/book/BookRepositoryTests.java +++ b/data-jdbc-schema-generation/src/test/java/zin/rashidi/boot/jdbcscgm/book/BookRepositoryTests.java @@ -4,7 +4,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.data.jdbc.DataJdbcTest; +import org.springframework.boot.data.jdbc.test.autoconfigure.DataJdbcTest; import org.springframework.context.annotation.Import; import org.springframework.core.io.FileSystemResource; import org.springframework.data.jdbc.core.mapping.schema.LiquibaseChangeSetWriter; diff --git a/data-mongodb-audit/src/test/java/zin/rashidi/boot/data/mongodb/user/UserAuditTests.java b/data-mongodb-audit/src/test/java/zin/rashidi/boot/data/mongodb/user/UserAuditTests.java index 35b34b15..a6e75741 100644 --- a/data-mongodb-audit/src/test/java/zin/rashidi/boot/data/mongodb/user/UserAuditTests.java +++ b/data-mongodb-audit/src/test/java/zin/rashidi/boot/data/mongodb/user/UserAuditTests.java @@ -8,7 +8,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; +import org.springframework.boot.data.mongodb.test.autoconfigure.DataMongoTest; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.data.mongodb.config.EnableMongoAuditing; diff --git a/data-mongodb-full-text-search/src/test/java/zin/rashidi/boot/data/mongodb/character/CharacterRepositoryTests.java b/data-mongodb-full-text-search/src/test/java/zin/rashidi/boot/data/mongodb/character/CharacterRepositoryTests.java index fe478173..00d083e7 100644 --- a/data-mongodb-full-text-search/src/test/java/zin/rashidi/boot/data/mongodb/character/CharacterRepositoryTests.java +++ b/data-mongodb-full-text-search/src/test/java/zin/rashidi/boot/data/mongodb/character/CharacterRepositoryTests.java @@ -9,7 +9,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; +import org.springframework.boot.data.mongodb.test.autoconfigure.DataMongoTest; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.core.MongoOperations; diff --git a/data-mongodb-tc-data-load/src/test/java/zin/rashidi/data/mongodb/tc/dataload/user/UserRepositoryTests.java b/data-mongodb-tc-data-load/src/test/java/zin/rashidi/data/mongodb/tc/dataload/user/UserRepositoryTests.java index 55c044a9..c34d841d 100644 --- a/data-mongodb-tc-data-load/src/test/java/zin/rashidi/data/mongodb/tc/dataload/user/UserRepositoryTests.java +++ b/data-mongodb-tc-data-load/src/test/java/zin/rashidi/data/mongodb/tc/dataload/user/UserRepositoryTests.java @@ -3,7 +3,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; +import org.springframework.boot.data.mongodb.test.autoconfigure.DataMongoTest; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; diff --git a/data-repository-definition/src/test/java/zin/rashidi/data/repositorydefinition/note/NoteRepositoryTests.java b/data-repository-definition/src/test/java/zin/rashidi/data/repositorydefinition/note/NoteRepositoryTests.java index dfde6ed7..a11141d4 100644 --- a/data-repository-definition/src/test/java/zin/rashidi/data/repositorydefinition/note/NoteRepositoryTests.java +++ b/data-repository-definition/src/test/java/zin/rashidi/data/repositorydefinition/note/NoteRepositoryTests.java @@ -3,7 +3,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.data.jdbc.DataJdbcTest; +import org.springframework.boot.data.jdbc.test.autoconfigure.DataJdbcTest; import org.springframework.context.annotation.Import; import org.springframework.test.context.jdbc.Sql; import org.springframework.test.context.jdbc.SqlMergeMode; diff --git a/graphql/src/test/java/zin/rashidi/boot/graphql/book/BookResourceTests.java b/graphql/src/test/java/zin/rashidi/boot/graphql/book/BookResourceTests.java index d9ba40dd..2377158f 100644 --- a/graphql/src/test/java/zin/rashidi/boot/graphql/book/BookResourceTests.java +++ b/graphql/src/test/java/zin/rashidi/boot/graphql/book/BookResourceTests.java @@ -3,7 +3,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.graphql.GraphQlTest; +import org.springframework.boot.graphql.test.autoconfigure.GraphQlTest; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.context.annotation.Configuration; import org.springframework.graphql.test.tester.GraphQlTester; diff --git a/jooq/src/test/java/zin/rashidi/boot/jooq/user/UserRepositoryTests.java b/jooq/src/test/java/zin/rashidi/boot/jooq/user/UserRepositoryTests.java index 41135db2..8b123df6 100644 --- a/jooq/src/test/java/zin/rashidi/boot/jooq/user/UserRepositoryTests.java +++ b/jooq/src/test/java/zin/rashidi/boot/jooq/user/UserRepositoryTests.java @@ -3,7 +3,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.jooq.JooqTest; +import org.springframework.boot.jooq.test.autoconfigure.JooqTest; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.stereotype.Repository; diff --git a/test-execution-listeners/src/test/java/zin/rashidi/boot/test/user/UserRepositoryTests.java b/test-execution-listeners/src/test/java/zin/rashidi/boot/test/user/UserRepositoryTests.java index 8e4cea0c..018fd05b 100644 --- a/test-execution-listeners/src/test/java/zin/rashidi/boot/test/user/UserRepositoryTests.java +++ b/test-execution-listeners/src/test/java/zin/rashidi/boot/test/user/UserRepositoryTests.java @@ -7,7 +7,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; +import org.springframework.boot.data.mongodb.test.autoconfigure.DataMongoTest; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.test.context.TestExecutionListeners; import org.testcontainers.junit.jupiter.Container; From 6b792cb70294ebe8cccc69ea32f2a16c6a665080 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 18 Apr 2026 08:02:08 +0000 Subject: [PATCH 09/23] fix: resolve compilation issues after Spring Boot 4.0 migration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix Jackson 3 ObjectMapper → JsonMapper type in batch modules - Fix Spring Batch DefaultBatchConfiguration → JdbcDefaultBatchConfiguration - Add spring-boot-jdbc dependency for DataSourceBuilder - Add modular test dependencies (data-jdbc-test, data-jpa-test, etc.) - Update test slice annotation imports to new Boot 4.0 packages - Fix TestEntityManager import and add spring-boot-jpa-test - Fix CacheAutoConfiguration and RedisAutoConfiguration imports - Replace testcontainers shaded Awaitility with direct Awaitility - Replace testcontainers shaded NumberUtils with inline implementation - Add explicit rest-assured version (removed from Boot 4.0 BOM) Agent-Logs-Url: https://github.com/rashidi/spring-boot-tutorials/sessions/53c726ed-2ba4-4f36-9516-fbd787a04e08 Co-authored-by: rashidi <380073+rashidi@users.noreply.github.com> --- .../zin/rashidi/boot/batch/rest/user/UserBatchJobTests.java | 2 +- .../java/zin/rashidi/boot/batch/user/UserBatchJobTests.java | 2 +- data-jpa-event/build.gradle.kts | 1 + .../java/zin/rashidi/data/event/user/UserRepositoryTests.java | 2 +- .../zin/rashidi/boot/data/mongodb/user/UserAuditTests.java | 2 +- data-redis-cache/build.gradle.kts | 2 ++ .../dataredis/cache/customer/CustomerRepositoryTests.java | 4 ++-- .../rashidi/datarest/compositeid/book/CreateAuthorTests.java | 3 +-- test-rest-assured/build.gradle.kts | 2 +- 9 files changed, 11 insertions(+), 9 deletions(-) diff --git a/batch-rest-repository/src/test/java/zin/rashidi/boot/batch/rest/user/UserBatchJobTests.java b/batch-rest-repository/src/test/java/zin/rashidi/boot/batch/rest/user/UserBatchJobTests.java index bed5db13..8f6419b2 100644 --- a/batch-rest-repository/src/test/java/zin/rashidi/boot/batch/rest/user/UserBatchJobTests.java +++ b/batch-rest-repository/src/test/java/zin/rashidi/boot/batch/rest/user/UserBatchJobTests.java @@ -29,7 +29,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.batch.core.ExitStatus.COMPLETED; import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; -import static org.testcontainers.shaded.org.awaitility.Awaitility.await; +import static org.awaitility.Awaitility.await; import static zin.rashidi.boot.batch.rest.user.UserBatchJobTests.BatchTestConfiguration; import static zin.rashidi.boot.batch.rest.user.UserBatchJobTests.MongoTestConfiguration; diff --git a/batch-skip-step/src/test/java/zin/rashidi/boot/batch/user/UserBatchJobTests.java b/batch-skip-step/src/test/java/zin/rashidi/boot/batch/user/UserBatchJobTests.java index d02a02aa..03f6045c 100644 --- a/batch-skip-step/src/test/java/zin/rashidi/boot/batch/user/UserBatchJobTests.java +++ b/batch-skip-step/src/test/java/zin/rashidi/boot/batch/user/UserBatchJobTests.java @@ -27,7 +27,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.batch.core.ExitStatus.COMPLETED; import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; -import static org.testcontainers.shaded.org.awaitility.Awaitility.await; +import static org.awaitility.Awaitility.await; import static zin.rashidi.boot.batch.user.UserBatchJobTests.BatchTestConfiguration; import static zin.rashidi.boot.batch.user.UserBatchJobTests.JdbcTestConfiguration; diff --git a/data-jpa-event/build.gradle.kts b/data-jpa-event/build.gradle.kts index 11973788..9028f31f 100644 --- a/data-jpa-event/build.gradle.kts +++ b/data-jpa-event/build.gradle.kts @@ -23,6 +23,7 @@ dependencies { testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-data-jpa-test") + testImplementation("org.springframework.boot:spring-boot-jpa-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.testcontainers:testcontainers-junit-jupiter") testImplementation("org.testcontainers:testcontainers-postgresql") diff --git a/data-jpa-event/src/test/java/zin/rashidi/data/event/user/UserRepositoryTests.java b/data-jpa-event/src/test/java/zin/rashidi/data/event/user/UserRepositoryTests.java index f25ef489..9c0c4545 100644 --- a/data-jpa-event/src/test/java/zin/rashidi/data/event/user/UserRepositoryTests.java +++ b/data-jpa-event/src/test/java/zin/rashidi/data/event/user/UserRepositoryTests.java @@ -4,7 +4,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.data.jpa.test.autoconfigure.DataJpaTest; -import org.springframework.boot.data.jpa.test.autoconfigure.TestEntityManager; +import org.springframework.boot.jpa.test.autoconfigure.TestEntityManager; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.ComponentScan.Filter; import org.testcontainers.junit.jupiter.Container; diff --git a/data-mongodb-audit/src/test/java/zin/rashidi/boot/data/mongodb/user/UserAuditTests.java b/data-mongodb-audit/src/test/java/zin/rashidi/boot/data/mongodb/user/UserAuditTests.java index a6e75741..30318bc2 100644 --- a/data-mongodb-audit/src/test/java/zin/rashidi/boot/data/mongodb/user/UserAuditTests.java +++ b/data-mongodb-audit/src/test/java/zin/rashidi/boot/data/mongodb/user/UserAuditTests.java @@ -3,7 +3,7 @@ import static java.time.Duration.ofSeconds; import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.context.annotation.FilterType.ANNOTATION; -import static org.testcontainers.shaded.org.awaitility.Awaitility.await; +import static org.awaitility.Awaitility.await; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/data-redis-cache/build.gradle.kts b/data-redis-cache/build.gradle.kts index f16bd4e6..5c524c23 100644 --- a/data-redis-cache/build.gradle.kts +++ b/data-redis-cache/build.gradle.kts @@ -23,6 +23,8 @@ dependencies { runtimeOnly("org.postgresql:postgresql") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-data-jpa-test") + testImplementation("org.springframework.boot:spring-boot-cache") + testImplementation("org.springframework.boot:spring-boot-data-redis") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.testcontainers:testcontainers-junit-jupiter") testImplementation("org.testcontainers:testcontainers-postgresql") diff --git a/data-redis-cache/src/test/java/zin/rashidi/dataredis/cache/customer/CustomerRepositoryTests.java b/data-redis-cache/src/test/java/zin/rashidi/dataredis/cache/customer/CustomerRepositoryTests.java index 5c8a51f6..eba5fd9f 100644 --- a/data-redis-cache/src/test/java/zin/rashidi/dataredis/cache/customer/CustomerRepositoryTests.java +++ b/data-redis-cache/src/test/java/zin/rashidi/dataredis/cache/customer/CustomerRepositoryTests.java @@ -5,7 +5,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.cache.autoconfigure.CacheAutoConfiguration; -import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; +import org.springframework.boot.data.redis.autoconfigure.DataRedisAutoConfiguration; import org.springframework.boot.data.jpa.test.autoconfigure.DataJpaTest; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.EnableCaching; @@ -22,7 +22,7 @@ * @author Rashidi Zin */ @Import(TestcontainersConfiguration.class) -@ImportAutoConfiguration({ RedisAutoConfiguration.class, CacheAutoConfiguration.class }) +@ImportAutoConfiguration({ DataRedisAutoConfiguration.class, CacheAutoConfiguration.class }) @Sql(executionPhase = BEFORE_TEST_CLASS, statements = "INSERT INTO customer (id, name) VALUES (1, 'Rashidi Zin')") @DataJpaTest(properties = "spring.jpa.hibernate.ddl-auto=create-drop", includeFilters = @Filter(EnableCaching.class)) class CustomerRepositoryTests { diff --git a/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/book/CreateAuthorTests.java b/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/book/CreateAuthorTests.java index 43a10ec6..5385cdf4 100644 --- a/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/book/CreateAuthorTests.java +++ b/data-rest-composite-id/src/test/java/zin/rashidi/datarest/compositeid/book/CreateAuthorTests.java @@ -9,7 +9,6 @@ import org.springframework.context.annotation.Import; import org.springframework.test.web.servlet.assertj.MockMvcTester; import org.testcontainers.junit.jupiter.Testcontainers; -import org.testcontainers.shaded.org.apache.commons.lang3.math.NumberUtils; import zin.rashidi.datarest.compositeid.TestcontainersConfiguration; import static org.assertj.core.api.Assertions.assertThat; @@ -48,7 +47,7 @@ void create() { } private Condition numeric() { - return new Condition<>(NumberUtils::isDigits, "is a number"); + return new Condition<>(s -> s != null && s.chars().allMatch(Character::isDigit), "is a number"); } private String idFromLocation(String location) { diff --git a/test-rest-assured/build.gradle.kts b/test-rest-assured/build.gradle.kts index bedd8a5e..2116d069 100644 --- a/test-rest-assured/build.gradle.kts +++ b/test-rest-assured/build.gradle.kts @@ -24,7 +24,7 @@ dependencies { testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.testcontainers:testcontainers-junit-jupiter") testImplementation("org.testcontainers:testcontainers-mongodb") - testImplementation("io.rest-assured:rest-assured") + testImplementation("io.rest-assured:rest-assured:5.5.2") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4.4") } From 8001e578b04ac2a9c4f96393ddb98d6523918412 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 18 Apr 2026 09:04:28 +0000 Subject: [PATCH 10/23] Replace deprecated JobLauncherTestUtils with JobOperatorTestUtils MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Spring Batch 6 deprecated JobLauncherTestUtils in favor of JobOperatorTestUtils. Replace all usages of: - JobLauncherTestUtils → JobOperatorTestUtils - launcher.launchJob() → operator.startJob() Updated in both batch-rest-repository and batch-skip-step modules, including their documentation files. Agent-Logs-Url: https://github.com/rashidi/spring-boot-tutorials/sessions/f5cea9fa-8fbd-4861-8105-a701cd12b040 Co-authored-by: rashidi <380073+rashidi@users.noreply.github.com> --- batch-rest-repository/README.adoc | 4 ++-- .../boot/batch/rest/user/UserBatchJobTests.java | 6 +++--- batch-skip-step/README.adoc | 4 ++-- .../zin/rashidi/boot/batch/user/UserBatchJobTests.java | 10 +++++----- docs/modules/ROOT/pages/batch-rest-repository.adoc | 4 ++-- docs/modules/ROOT/pages/batch-skip-step.adoc | 4 ++-- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/batch-rest-repository/README.adoc b/batch-rest-repository/README.adoc index 7ea8ecc9..199bec87 100644 --- a/batch-rest-repository/README.adoc +++ b/batch-rest-repository/README.adoc @@ -115,7 +115,7 @@ class UserBatchJobTests { private final static MongoDBContainer MONGO_DB_CONTAINER = new MongoDBContainer("mongo:latest"); @Autowired - private JobLauncherTestUtils launcher; + private JobOperatorTestUtils operator; @Autowired private MongoOperations mongoOperations; @@ -125,7 +125,7 @@ class UserBatchJobTests { void launch() { await().atMost(ofSeconds(30)).untilAsserted(() -> { - var execution = launcher.launchJob(); + var execution = operator.startJob(); assertThat(execution.getExitStatus()).isEqualTo(COMPLETED); }); diff --git a/batch-rest-repository/src/test/java/zin/rashidi/boot/batch/rest/user/UserBatchJobTests.java b/batch-rest-repository/src/test/java/zin/rashidi/boot/batch/rest/user/UserBatchJobTests.java index 8f6419b2..6a5d645e 100644 --- a/batch-rest-repository/src/test/java/zin/rashidi/boot/batch/rest/user/UserBatchJobTests.java +++ b/batch-rest-repository/src/test/java/zin/rashidi/boot/batch/rest/user/UserBatchJobTests.java @@ -6,7 +6,7 @@ import org.junit.jupiter.api.Test; import org.springframework.batch.core.configuration.support.JdbcDefaultBatchConfiguration; import org.springframework.batch.core.job.JobExecution; -import org.springframework.batch.test.JobLauncherTestUtils; +import org.springframework.batch.test.JobOperatorTestUtils; import org.springframework.batch.test.context.SpringBatchTest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.jdbc.DataSourceBuilder; @@ -51,7 +51,7 @@ class UserBatchJobTests { private final static MongoDBContainer MONGO_DB_CONTAINER = new MongoDBContainer("mongo:latest"); @Autowired - private JobLauncherTestUtils launcher; + private JobOperatorTestUtils operator; @Autowired private MongoOperations mongoOperations; @@ -61,7 +61,7 @@ class UserBatchJobTests { void launch() { await().atMost(ofSeconds(30)).untilAsserted(() -> { - var execution = launcher.launchJob(); + var execution = operator.startJob(); assertThat(execution.getExitStatus()).isEqualTo(COMPLETED); }); diff --git a/batch-skip-step/README.adoc b/batch-skip-step/README.adoc index 20cf9e81..494b7067 100644 --- a/batch-skip-step/README.adoc +++ b/batch-skip-step/README.adoc @@ -125,7 +125,7 @@ class UserBatchJobTests { private final static MySQLContainer MYSQL_CONTAINER = new MySQLContainer<>("mysql:lts"); @Autowired - private JobLauncherTestUtils launcher; + private JobOperatorTestUtils operator; @Autowired private JdbcTemplate jdbc; @@ -135,7 +135,7 @@ class UserBatchJobTests { void findAll() { await().atMost(10, SECONDS).untilAsserted(() -> { - var execution = launcher.launchJob(); + var execution = operator.startJob(); assertThat(execution.getExitStatus()).isEqualTo(COMPLETED); }); diff --git a/batch-skip-step/src/test/java/zin/rashidi/boot/batch/user/UserBatchJobTests.java b/batch-skip-step/src/test/java/zin/rashidi/boot/batch/user/UserBatchJobTests.java index 03f6045c..38c14e71 100644 --- a/batch-skip-step/src/test/java/zin/rashidi/boot/batch/user/UserBatchJobTests.java +++ b/batch-skip-step/src/test/java/zin/rashidi/boot/batch/user/UserBatchJobTests.java @@ -5,7 +5,7 @@ import org.junit.jupiter.api.Test; import org.springframework.batch.core.configuration.support.JdbcDefaultBatchConfiguration; import org.springframework.batch.core.job.JobExecution; -import org.springframework.batch.test.JobLauncherTestUtils; +import org.springframework.batch.test.JobOperatorTestUtils; import org.springframework.batch.test.context.SpringBatchTest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.jdbc.DataSourceBuilder; @@ -55,7 +55,7 @@ class UserBatchJobTests { private final static MySQLContainer MYSQL_CONTAINER = new MySQLContainer("mysql:lts"); @Autowired - private JobLauncherTestUtils launcher; + private JobOperatorTestUtils operator; @Autowired private JdbcTemplate jdbc; @@ -65,7 +65,7 @@ class UserBatchJobTests { void findAll() { await().atMost(10, SECONDS).untilAsserted(() -> { - var execution = launcher.launchJob(); + var execution = operator.startJob(); assertThat(execution.getExitStatus()).isEqualTo(COMPLETED); }); @@ -81,7 +81,7 @@ void findAll() { void skipByNullOutput() { await().atMost(10, SECONDS).untilAsserted(() -> { - var execution = launcher.launchJob(); + var execution = operator.startJob(); assertThat(execution.getExitStatus()).isEqualTo(COMPLETED); }); @@ -96,7 +96,7 @@ void skipByNullOutput() { void skipByException() { await().atMost(10, SECONDS).untilAsserted(() -> { - var execution = launcher.launchJob(); + var execution = operator.startJob(); assertThat(execution.getExitStatus()).isEqualTo(COMPLETED); }); diff --git a/docs/modules/ROOT/pages/batch-rest-repository.adoc b/docs/modules/ROOT/pages/batch-rest-repository.adoc index e21427a4..d456b727 100644 --- a/docs/modules/ROOT/pages/batch-rest-repository.adoc +++ b/docs/modules/ROOT/pages/batch-rest-repository.adoc @@ -114,7 +114,7 @@ class UserBatchJobTests { private final static MongoDBContainer MONGO_DB_CONTAINER = new MongoDBContainer("mongo:latest"); @Autowired - private JobLauncherTestUtils launcher; + private JobOperatorTestUtils operator; @Autowired private MongoOperations mongoOperations; @@ -124,7 +124,7 @@ class UserBatchJobTests { void launch() { await().atMost(ofSeconds(30)).untilAsserted(() -> { - var execution = launcher.launchJob(); + var execution = operator.startJob(); assertThat(execution.getExitStatus()).isEqualTo(COMPLETED); }); diff --git a/docs/modules/ROOT/pages/batch-skip-step.adoc b/docs/modules/ROOT/pages/batch-skip-step.adoc index 2c48cb61..d6d49579 100644 --- a/docs/modules/ROOT/pages/batch-skip-step.adoc +++ b/docs/modules/ROOT/pages/batch-skip-step.adoc @@ -123,7 +123,7 @@ class UserBatchJobTests { private final static MySQLContainer MYSQL_CONTAINER = new MySQLContainer<>("mysql:lts"); @Autowired - private JobLauncherTestUtils launcher; + private JobOperatorTestUtils operator; @Autowired private JdbcTemplate jdbc; @@ -133,7 +133,7 @@ class UserBatchJobTests { void findAll() { await().atMost(10, SECONDS).untilAsserted(() -> { - var execution = launcher.launchJob(); + var execution = operator.startJob(); assertThat(execution.getExitStatus()).isEqualTo(COMPLETED); }); From 5a97b55248afa6a8afbacbd09ed7d9e52350cc98 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 19 Apr 2026 05:19:27 +0000 Subject: [PATCH 11/23] Replace deprecated StepBuilder.chunk(int, PlatformTransactionManager) Use the new API: .chunk(int).transactionManager(PlatformTransactionManager) instead of the deprecated .chunk(int, PlatformTransactionManager) in both batch-rest-repository and batch-skip-step modules. Agent-Logs-Url: https://github.com/rashidi/spring-boot-tutorials/sessions/308e35db-05f2-4c2e-893e-b25ca2e8ada4 Co-authored-by: rashidi <380073+rashidi@users.noreply.github.com> --- .../zin/rashidi/boot/batch/rest/user/UserJobConfiguration.java | 3 ++- .../java/zin/rashidi/boot/batch/user/UserJobConfiguration.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/batch-rest-repository/src/main/java/zin/rashidi/boot/batch/rest/user/UserJobConfiguration.java b/batch-rest-repository/src/main/java/zin/rashidi/boot/batch/rest/user/UserJobConfiguration.java index a5aaeec7..b2dedfd8 100644 --- a/batch-rest-repository/src/main/java/zin/rashidi/boot/batch/rest/user/UserJobConfiguration.java +++ b/batch-rest-repository/src/main/java/zin/rashidi/boot/batch/rest/user/UserJobConfiguration.java @@ -43,7 +43,8 @@ public Job userJob() throws MalformedURLException { private Step step() throws MalformedURLException { return new StepBuilder("userStep", jobRepository) - .chunk(10, transactionManager) + .chunk(10) + .transactionManager(transactionManager) .reader(reader()) .writer(writer()) .build(); diff --git a/batch-skip-step/src/main/java/zin/rashidi/boot/batch/user/UserJobConfiguration.java b/batch-skip-step/src/main/java/zin/rashidi/boot/batch/user/UserJobConfiguration.java index bcd6c161..e3316819 100644 --- a/batch-skip-step/src/main/java/zin/rashidi/boot/batch/user/UserJobConfiguration.java +++ b/batch-skip-step/src/main/java/zin/rashidi/boot/batch/user/UserJobConfiguration.java @@ -61,7 +61,8 @@ private JdbcBatchItemWriter writer(DataSource dataSource) { private Step step(JobRepository jobRepository, PlatformTransactionManager transactionManager, DataSource dataSource) { return new StepBuilder("userStep", jobRepository) - .chunk(10, transactionManager) + .chunk(10) + .transactionManager(transactionManager) .reader(reader()) .processor(processor()) .writer(writer(dataSource)) From 68901f018b2964b7e649a0f40593d4a15bf3b7aa Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 19 Apr 2026 05:35:32 +0000 Subject: [PATCH 12/23] Add spring-boot-restclient dependency to data-domain-events TestRestTemplate requires RestTemplateBuilder from spring-boot-restclient, which is no longer transitively available in Spring Boot 4.0. Agent-Logs-Url: https://github.com/rashidi/spring-boot-tutorials/sessions/96764170-6bab-4c01-899c-a0f1b323ac7d Co-authored-by: rashidi <380073+rashidi@users.noreply.github.com> --- data-domain-events/build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/data-domain-events/build.gradle.kts b/data-domain-events/build.gradle.kts index 8d5f0e58..52ae3c3f 100644 --- a/data-domain-events/build.gradle.kts +++ b/data-domain-events/build.gradle.kts @@ -21,6 +21,7 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-data-jpa") implementation("org.springframework.boot:spring-boot-starter-webmvc") runtimeOnly("com.mysql:mysql-connector-j") + testImplementation("org.springframework.boot:spring-boot-restclient") testImplementation("org.springframework.boot:spring-boot-resttestclient") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") From cd2d071f60be49982c25ab5b759b5b1830c0a5e8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 19 Apr 2026 06:10:47 +0000 Subject: [PATCH 13/23] Fix three failing test modules for Spring Boot 4.0 upgrade batch-rest-repository: Add spring-boot-starter-jdbc (with HikariCP) to fix "No supported DataSource type found" from DataSourceBuilder.create(). Also disable Jackson 3.x FAIL_ON_TRAILING_TOKENS for JacksonJsonObjectReader. batch-skip-step: Disable Jackson 3.x FAIL_ON_TRAILING_TOKENS which is now enabled by default and breaks Spring Batch's JacksonJsonObjectReader. cloud-jdbc-env-repo: Add DataSource and JdbcTemplate auto-configuration to bootstrap context via spring.factories so the JDBC environment repository can be created during Config Server bootstrap. Agent-Logs-Url: https://github.com/rashidi/spring-boot-tutorials/sessions/45a35581-8e7d-4608-9f4d-38ea0fa68d3b Co-authored-by: rashidi <380073+rashidi@users.noreply.github.com> --- batch-rest-repository/build.gradle.kts | 2 +- .../rashidi/boot/batch/rest/user/UserJobConfiguration.java | 5 ++++- .../zin/rashidi/boot/batch/user/UserJobConfiguration.java | 5 ++++- .../src/test/resources/META-INF/spring.factories | 3 +++ 4 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 cloud-jdbc-env-repo/src/test/resources/META-INF/spring.factories diff --git a/batch-rest-repository/build.gradle.kts b/batch-rest-repository/build.gradle.kts index 37b05d5a..f6d85a7b 100644 --- a/batch-rest-repository/build.gradle.kts +++ b/batch-rest-repository/build.gradle.kts @@ -23,7 +23,7 @@ dependencies { implementation("tools.jackson.core:jackson-databind") runtimeOnly("com.mysql:mysql-connector-j") testImplementation("org.springframework.boot:spring-boot-starter-test") - testImplementation("org.springframework.boot:spring-boot-jdbc") + testImplementation("org.springframework.boot:spring-boot-starter-jdbc") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.springframework.batch:spring-batch-test") testImplementation("org.testcontainers:testcontainers-junit-jupiter") diff --git a/batch-rest-repository/src/main/java/zin/rashidi/boot/batch/rest/user/UserJobConfiguration.java b/batch-rest-repository/src/main/java/zin/rashidi/boot/batch/rest/user/UserJobConfiguration.java index b2dedfd8..b5883443 100644 --- a/batch-rest-repository/src/main/java/zin/rashidi/boot/batch/rest/user/UserJobConfiguration.java +++ b/batch-rest-repository/src/main/java/zin/rashidi/boot/batch/rest/user/UserJobConfiguration.java @@ -1,6 +1,7 @@ package zin.rashidi.boot.batch.rest.user; import java.net.MalformedURLException; +import tools.jackson.databind.DeserializationFeature; import tools.jackson.databind.json.JsonMapper; import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; @@ -24,7 +25,9 @@ @Configuration class UserJobConfiguration { - private static final JsonMapper OBJECT_MAPPER = new JsonMapper(); + private static final JsonMapper OBJECT_MAPPER = JsonMapper.builder() + .disable(DeserializationFeature.FAIL_ON_TRAILING_TOKENS) + .build(); private final JobRepository jobRepository; private final PlatformTransactionManager transactionManager; diff --git a/batch-skip-step/src/main/java/zin/rashidi/boot/batch/user/UserJobConfiguration.java b/batch-skip-step/src/main/java/zin/rashidi/boot/batch/user/UserJobConfiguration.java index e3316819..bcf428b2 100644 --- a/batch-skip-step/src/main/java/zin/rashidi/boot/batch/user/UserJobConfiguration.java +++ b/batch-skip-step/src/main/java/zin/rashidi/boot/batch/user/UserJobConfiguration.java @@ -1,5 +1,6 @@ package zin.rashidi.boot.batch.user; +import tools.jackson.databind.DeserializationFeature; import tools.jackson.databind.json.JsonMapper; import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; @@ -25,7 +26,9 @@ @Configuration class UserJobConfiguration { - private static final JsonMapper OBJECT_MAPPER = new JsonMapper(); + private static final JsonMapper OBJECT_MAPPER = JsonMapper.builder() + .disable(DeserializationFeature.FAIL_ON_TRAILING_TOKENS) + .build(); private JsonItemReader reader() { JacksonJsonObjectReader reader = new JacksonJsonObjectReader<>(UserFile.class); diff --git a/cloud-jdbc-env-repo/src/test/resources/META-INF/spring.factories b/cloud-jdbc-env-repo/src/test/resources/META-INF/spring.factories new file mode 100644 index 00000000..f2d56675 --- /dev/null +++ b/cloud-jdbc-env-repo/src/test/resources/META-INF/spring.factories @@ -0,0 +1,3 @@ +org.springframework.cloud.bootstrap.BootstrapConfiguration=\ +org.springframework.boot.jdbc.autoconfigure.DataSourceAutoConfiguration,\ +org.springframework.boot.jdbc.autoconfigure.JdbcTemplateAutoConfiguration From 81f38bf62158e2ea53f33bbf52e1d0b26168d856 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 19 Apr 2026 06:18:41 +0000 Subject: [PATCH 14/23] Update Spring Boot version references from 3.5.6 to 4.0.5 Agent-Logs-Url: https://github.com/rashidi/spring-boot-tutorials/sessions/f10a6385-b245-4d50-9e5e-9b44ec077d15 Co-authored-by: rashidi <380073+rashidi@users.noreply.github.com> --- README.adoc | 4 ++-- supplemental-ui/partials/footer-content.hbs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.adoc b/README.adoc index 68c2aa2d..d99d9d2e 100644 --- a/README.adoc +++ b/README.adoc @@ -9,7 +9,7 @@ Spring Data, Spring Batch, Spring Cloud, Spring Security, Spring GraphQL, and Sp with source code in individual submodules and can be found on {url-quickref}[GitHub]. image:https://img.shields.io/badge/Java_-25-blue?style=flat-square[Static Badge] -image:https://img.shields.io/badge/Spring_Boot-3.5.6-blue?style=flat-square&logo=springboot[Spring Boot version] +image:https://img.shields.io/badge/Spring_Boot-4.0.5-blue?style=flat-square&logo=springboot[Spring Boot version] image:https://img.shields.io/github/actions/workflow/status/rashidi/spring-boot-tutorials/gradle-build.yml?style=flat-square&logo=githubactions&color=blue[Gradle Build] image:https://img.shields.io/github/actions/workflow/status/rashidi/spring-boot-tutorials/build-and-publish-antora.yml?style=flat-square&logo=antora&label=Antora&color=blue[Antora Site Status, link={url-docs}] image:https://img.shields.io/sonar/coverage/rashidi_spring-boot-tutorials?server=https%3A%2F%2Fsonarcloud.io&style=flat-square&color=blue[Sonar Coverage] @@ -28,7 +28,7 @@ and always will be, my primary goal. With the help of https://github.com/dependabot[Dependabot], each tutorial is also kept up-to-date with the latest dependencies. Currently, we are using Java https://adoptium.net/en-GB/temurin/releases?version=25[Temurin 25] -with https://plugins.gradle.org/plugin/org.springframework.boot/3.5.6[Spring Boot 3.5.6]. +with https://plugins.gradle.org/plugin/org.springframework.boot/4.0.5[Spring Boot 4.0.5]. == Documentation diff --git a/supplemental-ui/partials/footer-content.hbs b/supplemental-ui/partials/footer-content.hbs index 62314704..218ad68c 100644 --- a/supplemental-ui/partials/footer-content.hbs +++ b/supplemental-ui/partials/footer-content.hbs @@ -2,6 +2,6 @@

Spring Boot Tutorials by Rashidi Zin

Java version - Spring Boot version + Spring Boot version License - Unlicense From 9b10d9fae4a7ff1740ffb09346d97e75eeae120c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 19 Apr 2026 06:27:51 +0000 Subject: [PATCH 15/23] Remove duplicate test dependencies across modules Remove non-starter test dependencies that are already transitively included by their corresponding starter counterparts: - data-jpa-audit: remove spring-boot-data-jpa-test (in starter-data-jpa-test) - data-jpa-event: remove spring-boot-data-jpa-test and spring-boot-jpa-test - data-jpa-filtered-query: remove spring-boot-data-jpa-test - data-jpa-hibernate-cache: remove spring-boot-data-jpa-test - data-redis-cache: remove spring-boot-data-jpa-test - test-slice-tests-rest: remove spring-boot-data-jpa-test and spring-boot-webmvc-test - web-thymeleaf-xss: remove spring-boot-webmvc-test - web-rest-client: remove spring-boot-restclient-test Agent-Logs-Url: https://github.com/rashidi/spring-boot-tutorials/sessions/b12868df-125e-444a-bd1a-c2304ba0e19b Co-authored-by: rashidi <380073+rashidi@users.noreply.github.com> --- data-jpa-audit/build.gradle.kts | 1 - data-jpa-event/build.gradle.kts | 2 -- data-jpa-filtered-query/build.gradle.kts | 1 - data-jpa-hibernate-cache/build.gradle.kts | 1 - data-redis-cache/build.gradle.kts | 3 +-- test-slice-tests-rest/build.gradle.kts | 4 +--- web-rest-client/build.gradle.kts | 1 - web-thymeleaf-xss/build.gradle.kts | 1 - 8 files changed, 2 insertions(+), 12 deletions(-) diff --git a/data-jpa-audit/build.gradle.kts b/data-jpa-audit/build.gradle.kts index 87729711..e18df045 100644 --- a/data-jpa-audit/build.gradle.kts +++ b/data-jpa-audit/build.gradle.kts @@ -22,7 +22,6 @@ dependencies { runtimeOnly("com.mysql:mysql-connector-j") testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test") testImplementation("org.springframework.boot:spring-boot-starter-test") - testImplementation("org.springframework.boot:spring-boot-data-jpa-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.testcontainers:testcontainers-junit-jupiter") testImplementation("org.testcontainers:testcontainers-mysql") diff --git a/data-jpa-event/build.gradle.kts b/data-jpa-event/build.gradle.kts index 9028f31f..2f21e37e 100644 --- a/data-jpa-event/build.gradle.kts +++ b/data-jpa-event/build.gradle.kts @@ -22,8 +22,6 @@ dependencies { runtimeOnly("org.postgresql:postgresql") testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test") testImplementation("org.springframework.boot:spring-boot-starter-test") - testImplementation("org.springframework.boot:spring-boot-data-jpa-test") - testImplementation("org.springframework.boot:spring-boot-jpa-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.testcontainers:testcontainers-junit-jupiter") testImplementation("org.testcontainers:testcontainers-postgresql") diff --git a/data-jpa-filtered-query/build.gradle.kts b/data-jpa-filtered-query/build.gradle.kts index 87729711..e18df045 100644 --- a/data-jpa-filtered-query/build.gradle.kts +++ b/data-jpa-filtered-query/build.gradle.kts @@ -22,7 +22,6 @@ dependencies { runtimeOnly("com.mysql:mysql-connector-j") testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test") testImplementation("org.springframework.boot:spring-boot-starter-test") - testImplementation("org.springframework.boot:spring-boot-data-jpa-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.testcontainers:testcontainers-junit-jupiter") testImplementation("org.testcontainers:testcontainers-mysql") diff --git a/data-jpa-hibernate-cache/build.gradle.kts b/data-jpa-hibernate-cache/build.gradle.kts index 57b88d24..17aec68e 100644 --- a/data-jpa-hibernate-cache/build.gradle.kts +++ b/data-jpa-hibernate-cache/build.gradle.kts @@ -24,7 +24,6 @@ dependencies { runtimeOnly("org.postgresql:postgresql") testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test") testImplementation("org.springframework.boot:spring-boot-starter-test") - testImplementation("org.springframework.boot:spring-boot-data-jpa-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.testcontainers:testcontainers-junit-jupiter") testImplementation("org.testcontainers:testcontainers-postgresql") diff --git a/data-redis-cache/build.gradle.kts b/data-redis-cache/build.gradle.kts index 5c524c23..ca12ead4 100644 --- a/data-redis-cache/build.gradle.kts +++ b/data-redis-cache/build.gradle.kts @@ -22,14 +22,13 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-data-redis") runtimeOnly("org.postgresql:postgresql") testImplementation("org.springframework.boot:spring-boot-starter-test") - testImplementation("org.springframework.boot:spring-boot-data-jpa-test") + testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test") testImplementation("org.springframework.boot:spring-boot-cache") testImplementation("org.springframework.boot:spring-boot-data-redis") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.testcontainers:testcontainers-junit-jupiter") testImplementation("org.testcontainers:testcontainers-postgresql") testImplementation("com.redis:testcontainers-redis") - testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/test-slice-tests-rest/build.gradle.kts b/test-slice-tests-rest/build.gradle.kts index f1010ce9..9f0680d2 100644 --- a/test-slice-tests-rest/build.gradle.kts +++ b/test-slice-tests-rest/build.gradle.kts @@ -24,12 +24,10 @@ dependencies { testImplementation("org.springframework.boot:spring-boot-starter-security-test") runtimeOnly("org.postgresql:postgresql") testImplementation("org.springframework.boot:spring-boot-starter-test") - testImplementation("org.springframework.boot:spring-boot-data-jpa-test") - testImplementation("org.springframework.boot:spring-boot-webmvc-test") testImplementation("org.springframework.boot:spring-boot-starter-webmvc-test") + testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.springframework.batch:spring-batch-test") - testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test") testImplementation("org.testcontainers:testcontainers-junit-jupiter") testImplementation("org.testcontainers:testcontainers-postgresql") testRuntimeOnly("org.junit.platform:junit-platform-launcher") diff --git a/web-rest-client/build.gradle.kts b/web-rest-client/build.gradle.kts index 5df6063a..e4f2d3a7 100644 --- a/web-rest-client/build.gradle.kts +++ b/web-rest-client/build.gradle.kts @@ -22,7 +22,6 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-webmvc") testImplementation("org.springframework.boot:spring-boot-starter-restclient-test") testImplementation("org.springframework.boot:spring-boot-starter-test") - testImplementation("org.springframework.boot:spring-boot-restclient-test") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/web-thymeleaf-xss/build.gradle.kts b/web-thymeleaf-xss/build.gradle.kts index cc889408..6f857032 100644 --- a/web-thymeleaf-xss/build.gradle.kts +++ b/web-thymeleaf-xss/build.gradle.kts @@ -23,7 +23,6 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-webmvc") implementation("org.thymeleaf.extras:thymeleaf-extras-springsecurity6") testImplementation("org.springframework.boot:spring-boot-starter-test") - testImplementation("org.springframework.boot:spring-boot-webmvc-test") testImplementation("org.springframework.boot:spring-boot-starter-webmvc-test") testImplementation("org.springframework.boot:spring-boot-starter-security-test") testRuntimeOnly("org.junit.platform:junit-platform-launcher") From 9505ef94efcc07d1c2421fa19bcb5dc9af7890df Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 19 Apr 2026 06:41:28 +0000 Subject: [PATCH 16/23] Add copilot-setup-steps.yml with Java 25 and Gradle setup Agent-Logs-Url: https://github.com/rashidi/spring-boot-tutorials/sessions/deb0b319-e002-45d2-86ac-320bfd9106ae Co-authored-by: rashidi <380073+rashidi@users.noreply.github.com> --- .github/workflows/copilot-setup-steps.yml | 30 +++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 .github/workflows/copilot-setup-steps.yml diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml new file mode 100644 index 00000000..2909e96e --- /dev/null +++ b/.github/workflows/copilot-setup-steps.yml @@ -0,0 +1,30 @@ +name: "Copilot Setup Steps" + +on: + workflow_dispatch: + push: + paths: + - .github/workflows/copilot-setup-steps.yml + pull_request: + paths: + - .github/workflows/copilot-setup-steps.yml + +jobs: + copilot-setup-steps: + runs-on: ubuntu-latest + + permissions: + contents: read + + steps: + - name: Checkout code + uses: actions/checkout@v6 + + - name: Set up JDK 25 + uses: actions/setup-java@v5 + with: + java-version: "25" + distribution: "temurin" + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v6 From d9b3c638b873960d007611d3697c61e71beed4d4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 19 Apr 2026 07:27:45 +0000 Subject: [PATCH 17/23] Fix test failures in data-mongodb-tc-data-load, data-mongodb-transactional, and data-redis-cache - data-mongodb-tc-data-load: Change tools.jackson.core:jackson-databind (Jackson 3.x) to com.fasterxml.jackson.core:jackson-databind (Jackson 2.x) since Jackson2RepositoryPopulatorFactoryBean requires com.fasterxml.jackson.databind.ObjectMapper - data-mongodb-transactional: Add missing spring-boot-restclient dependency (provides RestTemplateBuilder) and enable MongoDB replica set for transaction support - data-redis-cache: Make CacheConfiguration public and directly import it in test to ensure @EnableCaching is processed before repository beans are created Agent-Logs-Url: https://github.com/rashidi/spring-boot-tutorials/sessions/22102f1f-2daa-4d79-b852-7bca32feab6d Co-authored-by: rashidi <380073+rashidi@users.noreply.github.com> --- data-mongodb-tc-data-load/build.gradle.kts | 2 +- data-mongodb-transactional/build.gradle.kts | 1 + .../zin/rashidi/boot/data/mongodb/tm/user/CreateUserTests.java | 2 +- .../zin/rashidi/dataredis/cache/cache/CacheConfiguration.java | 2 +- .../dataredis/cache/customer/CustomerRepositoryTests.java | 3 ++- 5 files changed, 6 insertions(+), 4 deletions(-) diff --git a/data-mongodb-tc-data-load/build.gradle.kts b/data-mongodb-tc-data-load/build.gradle.kts index 4c1004a1..a42de566 100644 --- a/data-mongodb-tc-data-load/build.gradle.kts +++ b/data-mongodb-tc-data-load/build.gradle.kts @@ -24,7 +24,7 @@ dependencies { testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.testcontainers:testcontainers-junit-jupiter") testImplementation("org.testcontainers:testcontainers-mongodb") - testImplementation("tools.jackson.core:jackson-databind") + testImplementation("com.fasterxml.jackson.core:jackson-databind") } tasks.named("test") { diff --git a/data-mongodb-transactional/build.gradle.kts b/data-mongodb-transactional/build.gradle.kts index 19dfedc0..d6fbef38 100644 --- a/data-mongodb-transactional/build.gradle.kts +++ b/data-mongodb-transactional/build.gradle.kts @@ -20,6 +20,7 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter-data-mongodb") implementation("org.springframework.boot:spring-boot-starter-webmvc") + testImplementation("org.springframework.boot:spring-boot-restclient") testImplementation("org.springframework.boot:spring-boot-resttestclient") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") diff --git a/data-mongodb-transactional/src/test/java/zin/rashidi/boot/data/mongodb/tm/user/CreateUserTests.java b/data-mongodb-transactional/src/test/java/zin/rashidi/boot/data/mongodb/tm/user/CreateUserTests.java index 709b5ed9..38d5d2e2 100644 --- a/data-mongodb-transactional/src/test/java/zin/rashidi/boot/data/mongodb/tm/user/CreateUserTests.java +++ b/data-mongodb-transactional/src/test/java/zin/rashidi/boot/data/mongodb/tm/user/CreateUserTests.java @@ -28,7 +28,7 @@ class CreateUserTests { @Container @ServiceConnection - private static final MongoDBContainer mongo = new MongoDBContainer("mongo:latest"); + private static final MongoDBContainer mongo = new MongoDBContainer("mongo:latest").withReplicaSet(); @Autowired private TestRestTemplate restTemplate; diff --git a/data-redis-cache/src/main/java/zin/rashidi/dataredis/cache/cache/CacheConfiguration.java b/data-redis-cache/src/main/java/zin/rashidi/dataredis/cache/cache/CacheConfiguration.java index 93004ca2..f59204fb 100644 --- a/data-redis-cache/src/main/java/zin/rashidi/dataredis/cache/cache/CacheConfiguration.java +++ b/data-redis-cache/src/main/java/zin/rashidi/dataredis/cache/cache/CacheConfiguration.java @@ -11,7 +11,7 @@ */ @Configuration @EnableCaching -class CacheConfiguration { +public class CacheConfiguration { @Bean public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) { diff --git a/data-redis-cache/src/test/java/zin/rashidi/dataredis/cache/customer/CustomerRepositoryTests.java b/data-redis-cache/src/test/java/zin/rashidi/dataredis/cache/customer/CustomerRepositoryTests.java index eba5fd9f..b05ebe86 100644 --- a/data-redis-cache/src/test/java/zin/rashidi/dataredis/cache/customer/CustomerRepositoryTests.java +++ b/data-redis-cache/src/test/java/zin/rashidi/dataredis/cache/customer/CustomerRepositoryTests.java @@ -14,6 +14,7 @@ import org.springframework.test.context.jdbc.Sql; import org.springframework.transaction.annotation.Transactional; import zin.rashidi.dataredis.cache.TestcontainersConfiguration; +import zin.rashidi.dataredis.cache.cache.CacheConfiguration; import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.test.context.jdbc.Sql.ExecutionPhase.BEFORE_TEST_CLASS; @@ -21,7 +22,7 @@ /** * @author Rashidi Zin */ -@Import(TestcontainersConfiguration.class) +@Import({ TestcontainersConfiguration.class, CacheConfiguration.class }) @ImportAutoConfiguration({ DataRedisAutoConfiguration.class, CacheAutoConfiguration.class }) @Sql(executionPhase = BEFORE_TEST_CLASS, statements = "INSERT INTO customer (id, name) VALUES (1, 'Rashidi Zin')") @DataJpaTest(properties = "spring.jpa.hibernate.ddl-auto=create-drop", includeFilters = @Filter(EnableCaching.class)) From bad1833aac58ad0ef4fa013fe17a4d4413438344 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 19 Apr 2026 07:50:30 +0000 Subject: [PATCH 18/23] Fix test failures in data-rest-validation and data-rest-composite-id - data-rest-validation: Add missing spring-boot-restclient dependency and replace ValidationError with local DTO (Spring Data REST 5.x made constructor private) - data-rest-composite-id: Restore @GeneratedValue on Author.Id.id field (erroneously removed by OpenRewrite recipe during Spring Boot 4 upgrade) Agent-Logs-Url: https://github.com/rashidi/spring-boot-tutorials/sessions/b0bdf128-5dc8-4e3a-a405-e09e45e57664 Co-authored-by: rashidi <380073+rashidi@users.noreply.github.com> --- .../datarest/compositeid/book/Author.java | 1 + data-rest-validation/build.gradle.kts | 1 + .../boot/data/rest/book/CreateBookTests.java | 30 ++++++++++++++++++- 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/data-rest-composite-id/src/main/java/zin/rashidi/datarest/compositeid/book/Author.java b/data-rest-composite-id/src/main/java/zin/rashidi/datarest/compositeid/book/Author.java index c1836b03..ba75e7d8 100644 --- a/data-rest-composite-id/src/main/java/zin/rashidi/datarest/compositeid/book/Author.java +++ b/data-rest-composite-id/src/main/java/zin/rashidi/datarest/compositeid/book/Author.java @@ -19,6 +19,7 @@ class Author { @Embeddable static class Id implements Serializable { + @GeneratedValue private Long id; public Long id() { diff --git a/data-rest-validation/build.gradle.kts b/data-rest-validation/build.gradle.kts index e5c4a08f..24b25a77 100644 --- a/data-rest-validation/build.gradle.kts +++ b/data-rest-validation/build.gradle.kts @@ -22,6 +22,7 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-data-mongodb") implementation("org.springframework.boot:spring-boot-starter-data-rest") runtimeOnly("com.mysql:mysql-connector-j") + testImplementation("org.springframework.boot:spring-boot-restclient") testImplementation("org.springframework.boot:spring-boot-resttestclient") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-testcontainers") diff --git a/data-rest-validation/src/test/java/zin/rashidi/boot/data/rest/book/CreateBookTests.java b/data-rest-validation/src/test/java/zin/rashidi/boot/data/rest/book/CreateBookTests.java index f8dfea3d..2f9c1967 100644 --- a/data-rest-validation/src/test/java/zin/rashidi/boot/data/rest/book/CreateBookTests.java +++ b/data-rest-validation/src/test/java/zin/rashidi/boot/data/rest/book/CreateBookTests.java @@ -17,7 +17,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.resttestclient.TestRestTemplate; import org.springframework.context.annotation.Import; -import org.springframework.data.rest.webmvc.support.RepositoryConstraintViolationExceptionMessage.ValidationError; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; @@ -75,6 +74,35 @@ private HttpHeaders headers() { return headers; } + static class ValidationError { + + private String entity; + private String property; + private Object invalidValue; + private String message; + + public String getMessage() { + return message; + } + + public void setEntity(String entity) { + this.entity = entity; + } + + public void setProperty(String property) { + this.property = property; + } + + public void setInvalidValue(Object invalidValue) { + this.invalidValue = invalidValue; + } + + public void setMessage(String message) { + this.message = message; + } + + } + static class RepositoryRestErrorResponse { private List errors = new ArrayList<>(); From 2d757aeeafb20092867fe92300a71e7e1c4c5517 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 19 Apr 2026 08:57:34 +0000 Subject: [PATCH 19/23] Fix data-redis-cache flaky test: use synchronous Redis cache writes Spring Data Redis 4.x defaults to asynchronous cache writes when a reactive Redis connection factory (Lettuce) is detected. This caused a race condition where cache.get() was called before the async put() completed. Fix by configuring RedisCacheWriter with immediateWrites(). Also switch test from @DataJpaTest to @SpringBootTest to ensure the full caching infrastructure (AOP advisors) wraps repository beans. Agent-Logs-Url: https://github.com/rashidi/spring-boot-tutorials/sessions/5eb808bd-5243-47dc-aebd-59fed1ce1871 Co-authored-by: rashidi <380073+rashidi@users.noreply.github.com> --- .../cache/cache/CacheConfiguration.java | 5 ++++- .../cache/customer/CustomerRepositoryTests.java | 16 +++------------- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/data-redis-cache/src/main/java/zin/rashidi/dataredis/cache/cache/CacheConfiguration.java b/data-redis-cache/src/main/java/zin/rashidi/dataredis/cache/cache/CacheConfiguration.java index f59204fb..91c9fc2d 100644 --- a/data-redis-cache/src/main/java/zin/rashidi/dataredis/cache/cache/CacheConfiguration.java +++ b/data-redis-cache/src/main/java/zin/rashidi/dataredis/cache/cache/CacheConfiguration.java @@ -4,6 +4,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.cache.RedisCacheWriter; import org.springframework.data.redis.connection.RedisConnectionFactory; /** @@ -15,7 +16,9 @@ public class CacheConfiguration { @Bean public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) { - return RedisCacheManager.create(connectionFactory); + var cacheWriter = RedisCacheWriter.create(connectionFactory, + configurer -> configurer.immediateWrites()); + return RedisCacheManager.builder(cacheWriter).build(); } } diff --git a/data-redis-cache/src/test/java/zin/rashidi/dataredis/cache/customer/CustomerRepositoryTests.java b/data-redis-cache/src/test/java/zin/rashidi/dataredis/cache/customer/CustomerRepositoryTests.java index b05ebe86..c05ee1bc 100644 --- a/data-redis-cache/src/test/java/zin/rashidi/dataredis/cache/customer/CustomerRepositoryTests.java +++ b/data-redis-cache/src/test/java/zin/rashidi/dataredis/cache/customer/CustomerRepositoryTests.java @@ -3,18 +3,11 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.ImportAutoConfiguration; -import org.springframework.boot.cache.autoconfigure.CacheAutoConfiguration; -import org.springframework.boot.data.redis.autoconfigure.DataRedisAutoConfiguration; -import org.springframework.boot.data.jpa.test.autoconfigure.DataJpaTest; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cache.CacheManager; -import org.springframework.cache.annotation.EnableCaching; -import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.context.annotation.Import; import org.springframework.test.context.jdbc.Sql; -import org.springframework.transaction.annotation.Transactional; import zin.rashidi.dataredis.cache.TestcontainersConfiguration; -import zin.rashidi.dataredis.cache.cache.CacheConfiguration; import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.test.context.jdbc.Sql.ExecutionPhase.BEFORE_TEST_CLASS; @@ -22,10 +15,9 @@ /** * @author Rashidi Zin */ -@Import({ TestcontainersConfiguration.class, CacheConfiguration.class }) -@ImportAutoConfiguration({ DataRedisAutoConfiguration.class, CacheAutoConfiguration.class }) +@Import(TestcontainersConfiguration.class) @Sql(executionPhase = BEFORE_TEST_CLASS, statements = "INSERT INTO customer (id, name) VALUES (1, 'Rashidi Zin')") -@DataJpaTest(properties = "spring.jpa.hibernate.ddl-auto=create-drop", includeFilters = @Filter(EnableCaching.class)) +@SpringBootTest(properties = "spring.jpa.hibernate.ddl-auto=create-drop") class CustomerRepositoryTests { @Autowired @@ -35,7 +27,6 @@ class CustomerRepositoryTests { private CacheManager caches; @Test - @Transactional(readOnly = true) @DisplayName("Given the method name is configured as the cache's key Then subsequent retrieval should return the same value as initial retrieval") void findAll() { var persisted = customers.findAll(); @@ -45,7 +36,6 @@ void findAll() { } @Test - @Transactional(readOnly = true) @DisplayName("Given the cache is configured Then subsequent retrieval with the same key should return the same value as initial retrieval") void findById() { var persisted = customers.findById(1L).get(); From 309aad117d22c3a6a44a148cc76ecf9feb9b3873 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 19 Apr 2026 09:17:03 +0000 Subject: [PATCH 20/23] Plan: Fix test failures in batch-rest-repository, test-rest-assured, and test-slice-tests-rest Agent-Logs-Url: https://github.com/rashidi/spring-boot-tutorials/sessions/2da16e0e-b1f7-4277-814b-f73c3d51450c Co-authored-by: rashidi <380073+rashidi@users.noreply.github.com> --- modulith/docs/components.puml | 23 +++++++++++++++++------ modulith/docs/module-course.puml | 20 +++++++++++++++----- modulith/docs/module-student.puml | 20 +++++++++++++++----- modulith/docs/module-subscription.puml | 23 +++++++++++++++++------ 4 files changed, 64 insertions(+), 22 deletions(-) diff --git a/modulith/docs/components.puml b/modulith/docs/components.puml index 98a6ec7b..614e913f 100644 --- a/modulith/docs/components.puml +++ b/modulith/docs/components.puml @@ -1,21 +1,32 @@ @startuml -set separator none -title ModulithApplication +title ModulithApplication +set separator none top to bottom direction + + !include !include !include -Container_Boundary("ModulithApplication.ModulithApplication_boundary", "ModulithApplication", $tags="") { - Component(ModulithApplication.ModulithApplication.Course, "Course", $techn="Module", $descr="", $tags="", $link="") - Component(ModulithApplication.ModulithApplication.Student, "Student", $techn="Module", $descr="", $tags="", $link="") - Component(ModulithApplication.ModulithApplication.Subscription, "Subscription", $techn="Module", $descr="", $tags="", $link="") +System_Boundary("ModulithApplication_boundary", "ModulithApplication", $tags="") { + Container_Boundary("ModulithApplication.ModulithApplication_boundary", "ModulithApplication", $tags="") { + Component(ModulithApplication.ModulithApplication.Course, "Course", $techn="Module", $descr="", $tags="", $link="") + Component(ModulithApplication.ModulithApplication.Student, "Student", $techn="Module", $descr="", $tags="", $link="") + Component(ModulithApplication.ModulithApplication.Subscription, "Subscription", $techn="Module", $descr="", $tags="", $link="") + } + } Rel(ModulithApplication.ModulithApplication.Subscription, ModulithApplication.ModulithApplication.Student, "listens to", $techn="", $tags="", $link="") Rel(ModulithApplication.ModulithApplication.Subscription, ModulithApplication.ModulithApplication.Course, "listens to", $techn="", $tags="", $link="") SHOW_LEGEND(true) +hide stereotypes @enduml \ No newline at end of file diff --git a/modulith/docs/module-course.puml b/modulith/docs/module-course.puml index c55ecda2..71eb846b 100644 --- a/modulith/docs/module-course.puml +++ b/modulith/docs/module-course.puml @@ -1,17 +1,27 @@ @startuml -set separator none -title Course +title Course +set separator none top to bottom direction + + !include !include !include -Container_Boundary("ModulithApplication.ModulithApplication_boundary", "ModulithApplication", $tags="") { - Component(ModulithApplication.ModulithApplication.Course, "Course", $techn="Module", $descr="", $tags="", $link="") -} +System_Boundary("ModulithApplication_boundary", "ModulithApplication", $tags="") { + Container_Boundary("ModulithApplication.ModulithApplication_boundary", "ModulithApplication", $tags="") { + Component(ModulithApplication.ModulithApplication.Course, "Course", $techn="Module", $descr="", $tags="", $link="") + } +} SHOW_LEGEND(true) +hide stereotypes @enduml \ No newline at end of file diff --git a/modulith/docs/module-student.puml b/modulith/docs/module-student.puml index 882e78c1..189f2a6b 100644 --- a/modulith/docs/module-student.puml +++ b/modulith/docs/module-student.puml @@ -1,17 +1,27 @@ @startuml -set separator none -title Student +title Student +set separator none top to bottom direction + + !include !include !include -Container_Boundary("ModulithApplication.ModulithApplication_boundary", "ModulithApplication", $tags="") { - Component(ModulithApplication.ModulithApplication.Student, "Student", $techn="Module", $descr="", $tags="", $link="") -} +System_Boundary("ModulithApplication_boundary", "ModulithApplication", $tags="") { + Container_Boundary("ModulithApplication.ModulithApplication_boundary", "ModulithApplication", $tags="") { + Component(ModulithApplication.ModulithApplication.Student, "Student", $techn="Module", $descr="", $tags="", $link="") + } +} SHOW_LEGEND(true) +hide stereotypes @enduml \ No newline at end of file diff --git a/modulith/docs/module-subscription.puml b/modulith/docs/module-subscription.puml index 1ab59aad..ec2a1859 100644 --- a/modulith/docs/module-subscription.puml +++ b/modulith/docs/module-subscription.puml @@ -1,21 +1,32 @@ @startuml -set separator none -title Subscription +title Subscription +set separator none top to bottom direction + + !include !include !include -Container_Boundary("ModulithApplication.ModulithApplication_boundary", "ModulithApplication", $tags="") { - Component(ModulithApplication.ModulithApplication.Course, "Course", $techn="Module", $descr="", $tags="", $link="") - Component(ModulithApplication.ModulithApplication.Student, "Student", $techn="Module", $descr="", $tags="", $link="") - Component(ModulithApplication.ModulithApplication.Subscription, "Subscription", $techn="Module", $descr="", $tags="", $link="") +System_Boundary("ModulithApplication_boundary", "ModulithApplication", $tags="") { + Container_Boundary("ModulithApplication.ModulithApplication_boundary", "ModulithApplication", $tags="") { + Component(ModulithApplication.ModulithApplication.Course, "Course", $techn="Module", $descr="", $tags="", $link="") + Component(ModulithApplication.ModulithApplication.Student, "Student", $techn="Module", $descr="", $tags="", $link="") + Component(ModulithApplication.ModulithApplication.Subscription, "Subscription", $techn="Module", $descr="", $tags="", $link="") + } + } Rel(ModulithApplication.ModulithApplication.Subscription, ModulithApplication.ModulithApplication.Student, "listens to", $techn="", $tags="", $link="") Rel(ModulithApplication.ModulithApplication.Subscription, ModulithApplication.ModulithApplication.Course, "listens to", $techn="", $tags="", $link="") SHOW_LEGEND(true) +hide stereotypes @enduml \ No newline at end of file From 4815e9aab69e579935c12532a30bef0c37837b35 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 19 Apr 2026 09:21:14 +0000 Subject: [PATCH 21/23] Fix test failures in batch-rest-repository, test-rest-assured, and test-slice-tests-rest - batch-rest-repository: Make external REST API URL configurable via `batch.users.resource` property and provide local test JSON fixture so the test doesn't depend on network access to jsonplaceholder.typicode.com - test-rest-assured: Upgrade rest-assured from 5.5.2 to 6.0.0 which natively supports Groovy 5.x (shipped by Spring Boot 4.0) - test-slice-tests-rest: Add missing spring-boot-restclient dependency needed by TestRestTemplate's RestTemplateBuilder Agent-Logs-Url: https://github.com/rashidi/spring-boot-tutorials/sessions/2da16e0e-b1f7-4277-814b-f73c3d51450c Co-authored-by: rashidi <380073+rashidi@users.noreply.github.com> --- .../boot/batch/rest/user/UserJobConfiguration.java | 12 ++++++++---- .../boot/batch/rest/user/UserBatchJobTests.java | 3 ++- batch-rest-repository/src/test/resources/users.json | 12 ++++++++++++ test-rest-assured/build.gradle.kts | 2 +- test-slice-tests-rest/build.gradle.kts | 1 + 5 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 batch-rest-repository/src/test/resources/users.json diff --git a/batch-rest-repository/src/main/java/zin/rashidi/boot/batch/rest/user/UserJobConfiguration.java b/batch-rest-repository/src/main/java/zin/rashidi/boot/batch/rest/user/UserJobConfiguration.java index b5883443..7362cc3f 100644 --- a/batch-rest-repository/src/main/java/zin/rashidi/boot/batch/rest/user/UserJobConfiguration.java +++ b/batch-rest-repository/src/main/java/zin/rashidi/boot/batch/rest/user/UserJobConfiguration.java @@ -13,9 +13,10 @@ import org.springframework.batch.infrastructure.item.json.JacksonJsonObjectReader; import org.springframework.batch.infrastructure.item.json.JsonItemReader; import org.springframework.batch.infrastructure.item.json.builder.JsonItemReaderBuilder; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.io.UrlResource; +import org.springframework.core.io.Resource; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.transaction.PlatformTransactionManager; @@ -32,11 +33,14 @@ class UserJobConfiguration { private final JobRepository jobRepository; private final PlatformTransactionManager transactionManager; private final MongoOperations mongo; + private final Resource usersResource; - UserJobConfiguration(JobRepository jobRepository, PlatformTransactionManager transactionManager, MongoOperations mongo) { + UserJobConfiguration(JobRepository jobRepository, PlatformTransactionManager transactionManager, MongoOperations mongo, + @Value("${batch.users.resource:https://jsonplaceholder.typicode.com/users}") Resource usersResource) { this.jobRepository = jobRepository; this.transactionManager = transactionManager; this.mongo = mongo; + this.usersResource = usersResource; } @Bean @@ -53,7 +57,7 @@ private Step step() throws MalformedURLException { .build(); } - private JsonItemReader reader() throws MalformedURLException { + private JsonItemReader reader() { JacksonJsonObjectReader jsonObjectReader = new JacksonJsonObjectReader<>(User.class); jsonObjectReader.setMapper(OBJECT_MAPPER); @@ -61,7 +65,7 @@ private JsonItemReader reader() throws MalformedURLException { return new JsonItemReaderBuilder() .name("userReader") .jsonObjectReader(jsonObjectReader) - .resource(new UrlResource("https://jsonplaceholder.typicode.com/users")) + .resource(usersResource) .build(); } diff --git a/batch-rest-repository/src/test/java/zin/rashidi/boot/batch/rest/user/UserBatchJobTests.java b/batch-rest-repository/src/test/java/zin/rashidi/boot/batch/rest/user/UserBatchJobTests.java index 6a5d645e..a1c27f4f 100644 --- a/batch-rest-repository/src/test/java/zin/rashidi/boot/batch/rest/user/UserBatchJobTests.java +++ b/batch-rest-repository/src/test/java/zin/rashidi/boot/batch/rest/user/UserBatchJobTests.java @@ -38,7 +38,8 @@ */ @Testcontainers @SpringBatchTest -@SpringBootTest(classes = { BatchTestConfiguration.class, MongoTestConfiguration.class, UserJobConfiguration.class }, webEnvironment = NONE) +@SpringBootTest(classes = { BatchTestConfiguration.class, MongoTestConfiguration.class, UserJobConfiguration.class }, webEnvironment = NONE, + properties = "batch.users.resource=classpath:users.json") class UserBatchJobTests { @Container diff --git a/batch-rest-repository/src/test/resources/users.json b/batch-rest-repository/src/test/resources/users.json new file mode 100644 index 00000000..65c972e7 --- /dev/null +++ b/batch-rest-repository/src/test/resources/users.json @@ -0,0 +1,12 @@ +[ + {"id": 1, "username": "Bret"}, + {"id": 2, "username": "Antonette"}, + {"id": 3, "username": "Samantha"}, + {"id": 4, "username": "Karianne"}, + {"id": 5, "username": "Kamren"}, + {"id": 6, "username": "Leopoldo_Corkery"}, + {"id": 7, "username": "Elwyn.Skiles"}, + {"id": 8, "username": "Maxime_Nienow"}, + {"id": 9, "username": "Delphine"}, + {"id": 10, "username": "Moriah.Stiedemann"} +] diff --git a/test-rest-assured/build.gradle.kts b/test-rest-assured/build.gradle.kts index 2116d069..cfe871c5 100644 --- a/test-rest-assured/build.gradle.kts +++ b/test-rest-assured/build.gradle.kts @@ -24,7 +24,7 @@ dependencies { testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.testcontainers:testcontainers-junit-jupiter") testImplementation("org.testcontainers:testcontainers-mongodb") - testImplementation("io.rest-assured:rest-assured:5.5.2") + testImplementation("io.rest-assured:rest-assured:6.0.0") testImplementation("org.apache.httpcomponents.client5:httpclient5:5.4.4") } diff --git a/test-slice-tests-rest/build.gradle.kts b/test-slice-tests-rest/build.gradle.kts index 9f0680d2..ec92edf1 100644 --- a/test-slice-tests-rest/build.gradle.kts +++ b/test-slice-tests-rest/build.gradle.kts @@ -26,6 +26,7 @@ dependencies { testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.boot:spring-boot-starter-webmvc-test") testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test") + testImplementation("org.springframework.boot:spring-boot-restclient") testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.springframework.batch:spring-batch-test") testImplementation("org.testcontainers:testcontainers-junit-jupiter") From 2b8969b241a326ee14a11a7234f73627655d70d9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 19 Apr 2026 09:36:44 +0000 Subject: [PATCH 22/23] Plan: Fix Jackson2RepositoryPopulatorFactoryBean deprecation warning Agent-Logs-Url: https://github.com/rashidi/spring-boot-tutorials/sessions/8dd962d4-950a-4a84-abc0-b0d7abc62cd9 Co-authored-by: rashidi <380073+rashidi@users.noreply.github.com> --- .../init/ResourceReaderRepositoryPopulator.class | Bin 0 -> 6042 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 org/springframework/data/repository/init/ResourceReaderRepositoryPopulator.class diff --git a/org/springframework/data/repository/init/ResourceReaderRepositoryPopulator.class b/org/springframework/data/repository/init/ResourceReaderRepositoryPopulator.class new file mode 100644 index 0000000000000000000000000000000000000000..b1e81e8a630d38b4c2c4aac4fbffe830c2084027 GIT binary patch literal 6042 zcmbtYiGLK;9sj;fvXg8E&_Iw?!9@kbZsOKjuqFtN9Ev0%BoqzwnrtS?z-DJVvm1yv zwOU(yd9>APTg6s-*DH`nRp^1Oy)Ct^J^zjRX{F!yW@dMi>}o#v`M|!Hcl@sJ?|Sp< zTQ9r>;2Qiph6rjj)as~1RNw~N8A-c&$I6WiJI0uKz;^bhhm3-ecFer(S_RvgNLx9p zknS^GyXa)hKGPU7oxaj;ubnSu4W1K-u9qh_2=upfoh99lu6@S1kqk@Tjl;ksS6 zWY@7~cMSDt&=8Y?Hwv6nKDT3VpP4BL)U?P`3$RebA|2=8T!ChFs#vhH=}mSv%VUT#aHd7fDkV@0=+ z$k~O&pqa=Ov)LHpIA6mBIxfU=fr~1cMKSJlUDKgB8ZYAzOGlhON_Ikf6~p zQrwGlB(RbQI0_wstIrw$N$wIImtvJbW2OuNbqvW9#zw-FY-1$mi-TFq9hC@QRYj{@ zfoP;V^ZBgh!MA1H%oTcri^O)j!17Y=vP^dlz8bm(wpYSsc2*3Wdb2rf6thGk$d}u4 zm7}_2?HAT=-7)72{e`I1V=pA?oqDIthz_u_=t{=;$s4}IkmhbpsiB1pPn=f z3S3&rctP|99w)QRkPZ{Wbc(D!G9qD3C|HfWkr_498GCGuxjHR3nJ&^@_6YGCrQR~t zawXyTskuF|%8g+k_G`%M7(*^_JtdkK3FI zF*jy7?x>NKurXXT+$pfBlB>*?!0$f%=wc}N9fvujqC18=@Cg}TcM055*=%o5aiY}0 zbex?Obp_qOBG^cbExT3N~)d;C9aUVXb;d44Zk1sG) zR+6KNLBb85s;I`0=Z-t8N#T|EAgIIb$&5-pH`QynUtn>$0&F>$G4rzEYIu+}zr4{` z%oVILv$P+>1Nf4J`^y5$!cM(w)Ugj3gISX{kiFu=Iv&ASsRpa05{CR{(;!Y{XWSQ-)MLEn?3^uN#awt;U}dit;49aZTo|Z|eA#Ojvb8=3sH85l8TC4d2o6U3`x<>0N0o5VKUd>o>+tfz@F>gH$&c z{TP0LA8PoKj;HYqn*k|8^+f6yQl@ZPm1RKS$}pR-Ija-t(D0nV`uQk3GvSoegN8|F z=1LT*g=4An=saLJG|zJ1n|E8TMNi!|kvBVYZ1`2H$@b_H5$ z%DdSK^;;u3qfnF-H+aUK^}<aucXPjPI} zbaqK8*;U96I=kC&Ecv&;SX&sisAgA1@#ev@T!hLwo5jA{ER5Piy@q_ivdJNb1^oph zv%lNOE5;gr8axG6rBoi{JuI0NLhWwQ_0Ou=K{HK#>$CpDKx$adQvL}>Ln%?Y8eR=j z9G^hjc9eGbT$pD|EpQ>FtJ=@LO`q@%bw*)VpZA{bL`(DQ^-Qh&0A}EMHCxpLuShV| zD}p%3$5_#vpfhHnq{tQT%?5u?ij_r{jgpsag5FwS>)BBYvZ$Y0NLkPd%^^ffXmKxU z`(GF|pS{4wcgL4R>(^(p{^ycdzxuMW)slg;I;f`J7ljHgf4THKtYn{8&;QTjc|>u( zY^C{yr%8SXP$M7k5ID+tJ;Y+*m|EpqnPWsgspjlPZM27&>WpPT>_=@)smm%kh_iflqPakbKIMlQeKAN6E7x znVP}}Xx%a&54sF3Hx%O0P~y=*?!O}K6TD97mT(aGHGbn$-r!S?N~E^VCOb-ytq|F0 ziEPw&KcDRNitKNRj}lniPQ4|Tlc}Z~=my8pHIO=no^BeeX&O5PdfKLOqhNb?D<>b8 z;u-C=&mz+_Qu`w62WsNA{Zp`}VMmaR*B(W&y)IsN5`B-LGhTNBeTqnXG#>TIw8$Ch zv}%dOp|)<-0(ldH9V%_ zrnj&~gQ20G^Z#NcCvT$RO++I9L6pO?0PWMH8^zl{!KR9EI4S zk{+4@UQ;^JDu#T literal 0 HcmV?d00001 From 938092fd31badc866ac29f29677a54ea2200c258 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 19 Apr 2026 09:43:08 +0000 Subject: [PATCH 23/23] Replace deprecated Jackson2RepositoryPopulatorFactoryBean with JacksonRepositoryPopulatorFactoryBean Switch data-mongodb-tc-data-load from Jackson 2 (com.fasterxml.jackson.core:jackson-databind) to Jackson 3 (tools.jackson.core:jackson-databind) and use the non-deprecated JacksonRepositoryPopulatorFactoryBean in tests. Agent-Logs-Url: https://github.com/rashidi/spring-boot-tutorials/sessions/8dd962d4-950a-4a84-abc0-b0d7abc62cd9 Co-authored-by: rashidi <380073+rashidi@users.noreply.github.com> --- data-mongodb-tc-data-load/build.gradle.kts | 2 +- .../tc/dataload/user/UserRepositoryTests.java | 6 +++--- .../init/ResourceReaderRepositoryPopulator.class | Bin 6042 -> 0 bytes 3 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 org/springframework/data/repository/init/ResourceReaderRepositoryPopulator.class diff --git a/data-mongodb-tc-data-load/build.gradle.kts b/data-mongodb-tc-data-load/build.gradle.kts index a42de566..4c1004a1 100644 --- a/data-mongodb-tc-data-load/build.gradle.kts +++ b/data-mongodb-tc-data-load/build.gradle.kts @@ -24,7 +24,7 @@ dependencies { testImplementation("org.springframework.boot:spring-boot-testcontainers") testImplementation("org.testcontainers:testcontainers-junit-jupiter") testImplementation("org.testcontainers:testcontainers-mongodb") - testImplementation("com.fasterxml.jackson.core:jackson-databind") + testImplementation("tools.jackson.core:jackson-databind") } tasks.named("test") { diff --git a/data-mongodb-tc-data-load/src/test/java/zin/rashidi/data/mongodb/tc/dataload/user/UserRepositoryTests.java b/data-mongodb-tc-data-load/src/test/java/zin/rashidi/data/mongodb/tc/dataload/user/UserRepositoryTests.java index c34d841d..1d18c9aa 100644 --- a/data-mongodb-tc-data-load/src/test/java/zin/rashidi/data/mongodb/tc/dataload/user/UserRepositoryTests.java +++ b/data-mongodb-tc-data-load/src/test/java/zin/rashidi/data/mongodb/tc/dataload/user/UserRepositoryTests.java @@ -10,7 +10,7 @@ import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.data.repository.init.Jackson2RepositoryPopulatorFactoryBean; +import org.springframework.data.repository.init.JacksonRepositoryPopulatorFactoryBean; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; import org.testcontainers.mongodb.MongoDBContainer; @@ -54,8 +54,8 @@ void findByUsernameWithNonExistingUsername() { static class RepositoryPopulatorTestConfiguration { @Bean - public Jackson2RepositoryPopulatorFactoryBean jacksonRepositoryPopulator() { - var populator = new Jackson2RepositoryPopulatorFactoryBean(); + public JacksonRepositoryPopulatorFactoryBean jacksonRepositoryPopulator() { + var populator = new JacksonRepositoryPopulatorFactoryBean(); populator.setResources(new Resource[] { new ClassPathResource("users.json") }); return populator; } diff --git a/org/springframework/data/repository/init/ResourceReaderRepositoryPopulator.class b/org/springframework/data/repository/init/ResourceReaderRepositoryPopulator.class deleted file mode 100644 index b1e81e8a630d38b4c2c4aac4fbffe830c2084027..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6042 zcmbtYiGLK;9sj;fvXg8E&_Iw?!9@kbZsOKjuqFtN9Ev0%BoqzwnrtS?z-DJVvm1yv zwOU(yd9>APTg6s-*DH`nRp^1Oy)Ct^J^zjRX{F!yW@dMi>}o#v`M|!Hcl@sJ?|Sp< zTQ9r>;2Qiph6rjj)as~1RNw~N8A-c&$I6WiJI0uKz;^bhhm3-ecFer(S_RvgNLx9p zknS^GyXa)hKGPU7oxaj;ubnSu4W1K-u9qh_2=upfoh99lu6@S1kqk@Tjl;ksS6 zWY@7~cMSDt&=8Y?Hwv6nKDT3VpP4BL)U?P`3$RebA|2=8T!ChFs#vhH=}mSv%VUT#aHd7fDkV@0=+ z$k~O&pqa=Ov)LHpIA6mBIxfU=fr~1cMKSJlUDKgB8ZYAzOGlhON_Ikf6~p zQrwGlB(RbQI0_wstIrw$N$wIImtvJbW2OuNbqvW9#zw-FY-1$mi-TFq9hC@QRYj{@ zfoP;V^ZBgh!MA1H%oTcri^O)j!17Y=vP^dlz8bm(wpYSsc2*3Wdb2rf6thGk$d}u4 zm7}_2?HAT=-7)72{e`I1V=pA?oqDIthz_u_=t{=;$s4}IkmhbpsiB1pPn=f z3S3&rctP|99w)QRkPZ{Wbc(D!G9qD3C|HfWkr_498GCGuxjHR3nJ&^@_6YGCrQR~t zawXyTskuF|%8g+k_G`%M7(*^_JtdkK3FI zF*jy7?x>NKurXXT+$pfBlB>*?!0$f%=wc}N9fvujqC18=@Cg}TcM055*=%o5aiY}0 zbex?Obp_qOBG^cbExT3N~)d;C9aUVXb;d44Zk1sG) zR+6KNLBb85s;I`0=Z-t8N#T|EAgIIb$&5-pH`QynUtn>$0&F>$G4rzEYIu+}zr4{` z%oVILv$P+>1Nf4J`^y5$!cM(w)Ugj3gISX{kiFu=Iv&ASsRpa05{CR{(;!Y{XWSQ-)MLEn?3^uN#awt;U}dit;49aZTo|Z|eA#Ojvb8=3sH85l8TC4d2o6U3`x<>0N0o5VKUd>o>+tfz@F>gH$&c z{TP0LA8PoKj;HYqn*k|8^+f6yQl@ZPm1RKS$}pR-Ija-t(D0nV`uQk3GvSoegN8|F z=1LT*g=4An=saLJG|zJ1n|E8TMNi!|kvBVYZ1`2H$@b_H5$ z%DdSK^;;u3qfnF-H+aUK^}<aucXPjPI} zbaqK8*;U96I=kC&Ecv&;SX&sisAgA1@#ev@T!hLwo5jA{ER5Piy@q_ivdJNb1^oph zv%lNOE5;gr8axG6rBoi{JuI0NLhWwQ_0Ou=K{HK#>$CpDKx$adQvL}>Ln%?Y8eR=j z9G^hjc9eGbT$pD|EpQ>FtJ=@LO`q@%bw*)VpZA{bL`(DQ^-Qh&0A}EMHCxpLuShV| zD}p%3$5_#vpfhHnq{tQT%?5u?ij_r{jgpsag5FwS>)BBYvZ$Y0NLkPd%^^ffXmKxU z`(GF|pS{4wcgL4R>(^(p{^ycdzxuMW)slg;I;f`J7ljHgf4THKtYn{8&;QTjc|>u( zY^C{yr%8SXP$M7k5ID+tJ;Y+*m|EpqnPWsgspjlPZM27&>WpPT>_=@)smm%kh_iflqPakbKIMlQeKAN6E7x znVP}}Xx%a&54sF3Hx%O0P~y=*?!O}K6TD97mT(aGHGbn$-r!S?N~E^VCOb-ytq|F0 ziEPw&KcDRNitKNRj}lniPQ4|Tlc}Z~=my8pHIO=no^BeeX&O5PdfKLOqhNb?D<>b8 z;u-C=&mz+_Qu`w62WsNA{Zp`}VMmaR*B(W&y)IsN5`B-LGhTNBeTqnXG#>TIw8$Ch zv}%dOp|)<-0(ldH9V%_ zrnj&~gQ20G^Z#NcCvT$RO++I9L6pO?0PWMH8^zl{!KR9EI4S zk{+4@UQ;^JDu#T