diff --git a/batch-boot-jpa-sample/docker/docker-compose.yml b/batch-boot-jpa-sample/docker/docker-compose.yml index d6c33d152..807d34441 100644 --- a/batch-boot-jpa-sample/docker/docker-compose.yml +++ b/batch-boot-jpa-sample/docker/docker-compose.yml @@ -9,6 +9,11 @@ services: - POSTGRES_USER=appuser - POSTGRES_PASSWORD=secret - POSTGRES_DB=appdb + healthcheck: + test: ["CMD-SHELL", "pg_isready -U appuser -d appdb"] + interval: 10s + timeout: 5s + retries: 5 ports: - "5432:5432" networks: diff --git a/batch-boot-jpa-sample/pom.xml b/batch-boot-jpa-sample/pom.xml index f3aa7552d..37babaf43 100644 --- a/batch-boot-jpa-sample/pom.xml +++ b/batch-boot-jpa-sample/pom.xml @@ -7,7 +7,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.6 + 3.4.0 com.example.bootbatchjpa @@ -22,7 +22,8 @@ 21 5.2.1 - 2.6.0 + 2.7.0 + ${project.build.directory}/test-results 2.43.0 @@ -242,7 +243,7 @@ - 1.22.0 + 1.25.0 diff --git a/batch-boot-jpa-sample/src/main/java/com/example/bootbatchjpa/Application.java b/batch-boot-jpa-sample/src/main/java/com/example/bootbatchjpa/BatchApplication.java similarity index 82% rename from batch-boot-jpa-sample/src/main/java/com/example/bootbatchjpa/Application.java rename to batch-boot-jpa-sample/src/main/java/com/example/bootbatchjpa/BatchApplication.java index cacb8a503..56d5ee4e3 100644 --- a/batch-boot-jpa-sample/src/main/java/com/example/bootbatchjpa/Application.java +++ b/batch-boot-jpa-sample/src/main/java/com/example/bootbatchjpa/BatchApplication.java @@ -7,9 +7,9 @@ @SpringBootApplication @EnableConfigurationProperties({ApplicationProperties.class}) -public class Application { +public class BatchApplication { public static void main(String[] args) { - SpringApplication.run(Application.class, args); + SpringApplication.run(BatchApplication.class, args); } } diff --git a/batch-boot-jpa-sample/src/main/java/com/example/bootbatchjpa/config/BatchConfig.java b/batch-boot-jpa-sample/src/main/java/com/example/bootbatchjpa/config/BatchConfig.java index b954454da..8d149949b 100644 --- a/batch-boot-jpa-sample/src/main/java/com/example/bootbatchjpa/config/BatchConfig.java +++ b/batch-boot-jpa-sample/src/main/java/com/example/bootbatchjpa/config/BatchConfig.java @@ -9,7 +9,12 @@ import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.batch.core.*; +import org.springframework.batch.core.BatchStatus; +import org.springframework.batch.core.Job; +import org.springframework.batch.core.JobExecution; +import org.springframework.batch.core.JobExecutionListener; +import org.springframework.batch.core.JobParameters; +import org.springframework.batch.core.Step; import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; import org.springframework.batch.core.configuration.annotation.StepScope; import org.springframework.batch.core.job.builder.JobBuilder; @@ -23,6 +28,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.lang.NonNull; import org.springframework.transaction.PlatformTransactionManager; @Configuration(proxyBeanMethods = false) @@ -59,7 +65,6 @@ Job allCustomersJob( .start(step) .incrementer(new RunIdIncrementer()) .listener(this) - .start(step) .build(); } @@ -94,7 +99,7 @@ JpaPagingItemReader jpaPagingItemReader( } @Override - public void afterJob(JobExecution jobExecution) { + public void afterJob(@NonNull JobExecution jobExecution) { if (jobExecution.getStatus() == BatchStatus.COMPLETED) { log.info("BATCH JOB COMPLETED SUCCESSFULLY"); } diff --git a/batch-boot-jpa-sample/src/main/java/com/example/bootbatchjpa/config/Initializer.java b/batch-boot-jpa-sample/src/main/java/com/example/bootbatchjpa/config/Initializer.java index 3479a7832..c7a9ec70d 100644 --- a/batch-boot-jpa-sample/src/main/java/com/example/bootbatchjpa/config/Initializer.java +++ b/batch-boot-jpa-sample/src/main/java/com/example/bootbatchjpa/config/Initializer.java @@ -27,6 +27,7 @@ public void run(String... args) { List customerList = Instancio.ofList(Customer.class) .size(1000) + .ignore(field(Customer.class, "id")) .generate( field(Customer.class, "gender"), gen -> gen.oneOf("male", "female")) .create(); diff --git a/batch-boot-jpa-sample/src/test/java/com/example/bootbatchjpa/TestApplication.java b/batch-boot-jpa-sample/src/test/java/com/example/bootbatchjpa/TestApplication.java deleted file mode 100644 index 014923f7c..000000000 --- a/batch-boot-jpa-sample/src/test/java/com/example/bootbatchjpa/TestApplication.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.example.bootbatchjpa; - -import com.example.bootbatchjpa.common.TestContainersConfig; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.boot.testcontainers.context.ImportTestcontainers; - -@TestConfiguration(proxyBeanMethods = false) -@ImportTestcontainers(TestContainersConfig.class) -public class TestApplication { - - public static void main(String[] args) { - SpringApplication.from(Application::main).with(TestApplication.class).run(args); - } -} diff --git a/batch-boot-jpa-sample/src/test/java/com/example/bootbatchjpa/TestBatchApplication.java b/batch-boot-jpa-sample/src/test/java/com/example/bootbatchjpa/TestBatchApplication.java new file mode 100644 index 000000000..25f98a5d2 --- /dev/null +++ b/batch-boot-jpa-sample/src/test/java/com/example/bootbatchjpa/TestBatchApplication.java @@ -0,0 +1,11 @@ +package com.example.bootbatchjpa; + +import com.example.bootbatchjpa.common.ContainersConfig; +import org.springframework.boot.SpringApplication; + +public class TestBatchApplication { + + public static void main(String[] args) { + SpringApplication.from(BatchApplication::main).with(ContainersConfig.class).run(args); + } +} diff --git a/batch-boot-jpa-sample/src/test/java/com/example/bootbatchjpa/common/AbstractIntegrationTest.java b/batch-boot-jpa-sample/src/test/java/com/example/bootbatchjpa/common/AbstractIntegrationTest.java index daa6a1746..e6e8eafd6 100644 --- a/batch-boot-jpa-sample/src/test/java/com/example/bootbatchjpa/common/AbstractIntegrationTest.java +++ b/batch-boot-jpa-sample/src/test/java/com/example/bootbatchjpa/common/AbstractIntegrationTest.java @@ -3,7 +3,6 @@ import static com.example.bootbatchjpa.utils.AppConstants.PROFILE_TEST; import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; -import com.example.bootbatchjpa.TestApplication; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; @@ -14,7 +13,7 @@ @ActiveProfiles({PROFILE_TEST}) @SpringBootTest( webEnvironment = RANDOM_PORT, - classes = {TestApplication.class}) + classes = {ContainersConfig.class}) @AutoConfigureMockMvc public abstract class AbstractIntegrationTest { diff --git a/batch-boot-jpa-sample/src/test/java/com/example/bootbatchjpa/common/ContainersConfig.java b/batch-boot-jpa-sample/src/test/java/com/example/bootbatchjpa/common/ContainersConfig.java new file mode 100644 index 000000000..9b6d97457 --- /dev/null +++ b/batch-boot-jpa-sample/src/test/java/com/example/bootbatchjpa/common/ContainersConfig.java @@ -0,0 +1,17 @@ +package com.example.bootbatchjpa.common; + +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.utility.DockerImageName; + +@TestConfiguration(proxyBeanMethods = false) +public class ContainersConfig { + + @Bean + @ServiceConnection + PostgreSQLContainer postgreSQLContainer() { + return new PostgreSQLContainer<>(DockerImageName.parse("postgres").withTag("17.2-alpine")); + } +} diff --git a/batch-boot-jpa-sample/src/test/java/com/example/bootbatchjpa/common/TestContainersConfig.java b/batch-boot-jpa-sample/src/test/java/com/example/bootbatchjpa/common/TestContainersConfig.java deleted file mode 100644 index a372135ee..000000000 --- a/batch-boot-jpa-sample/src/test/java/com/example/bootbatchjpa/common/TestContainersConfig.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.example.bootbatchjpa.common; - -import org.springframework.boot.testcontainers.service.connection.ServiceConnection; -import org.testcontainers.containers.PostgreSQLContainer; -import org.testcontainers.utility.DockerImageName; - -public interface TestContainersConfig { - - @ServiceConnection - PostgreSQLContainer postgreSQLContainer = - new PostgreSQLContainer<>(DockerImageName.parse("postgres").withTag("17.2-alpine")); -} diff --git a/batch-boot-jpa-sample/src/test/java/com/example/bootbatchjpa/repository/SchemaValidationTest.java b/batch-boot-jpa-sample/src/test/java/com/example/bootbatchjpa/repository/SchemaValidationTest.java index ace772ed2..6edc759ad 100644 --- a/batch-boot-jpa-sample/src/test/java/com/example/bootbatchjpa/repository/SchemaValidationTest.java +++ b/batch-boot-jpa-sample/src/test/java/com/example/bootbatchjpa/repository/SchemaValidationTest.java @@ -2,20 +2,18 @@ import static org.assertj.core.api.Assertions.assertThat; -import com.example.bootbatchjpa.common.TestContainersConfig; +import com.example.bootbatchjpa.common.ContainersConfig; import com.zaxxer.hikari.HikariDataSource; import javax.sql.DataSource; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.boot.testcontainers.context.ImportTestcontainers; +import org.springframework.context.annotation.Import; -@DataJpaTest( - properties = { - "spring.jpa.hibernate.ddl-auto=validate", - "spring.test.database.replace=none" - }) -@ImportTestcontainers(TestContainersConfig.class) +@DataJpaTest(properties = {"spring.jpa.hibernate.ddl-auto=validate"}) +@Import(ContainersConfig.class) +@AutoConfigureTestDatabase class SchemaValidationTest { @Autowired private DataSource dataSource; diff --git a/batch-boot-jpa-sample/src/test/java/com/example/bootbatchjpa/web/controllers/CustomerControllerIT.java b/batch-boot-jpa-sample/src/test/java/com/example/bootbatchjpa/web/controllers/CustomerControllerIT.java index e5a4df57d..4d90dfb0d 100644 --- a/batch-boot-jpa-sample/src/test/java/com/example/bootbatchjpa/web/controllers/CustomerControllerIT.java +++ b/batch-boot-jpa-sample/src/test/java/com/example/bootbatchjpa/web/controllers/CustomerControllerIT.java @@ -35,6 +35,7 @@ void setUp() { customerList = Instancio.ofList(Customer.class) .size(3) + .ignore(field(Customer.class, "id")) .generate( field(Customer.class, "gender"), gen -> gen.oneOf("male", "female")) .create(); @@ -72,6 +73,7 @@ void shouldFindCustomerById() throws Exception { @Test void shouldCreateNewCustomer() throws Exception { Customer customer = Instancio.create(Customer.class); + customer.setId(null); this.mockMvc .perform( post("/api/customers") diff --git a/batch-boot-jpa-sample/src/test/java/com/example/bootbatchjpa/web/controllers/CustomerControllerTest.java b/batch-boot-jpa-sample/src/test/java/com/example/bootbatchjpa/web/controllers/CustomerControllerTest.java index 22cc0c9fd..4b4120632 100644 --- a/batch-boot-jpa-sample/src/test/java/com/example/bootbatchjpa/web/controllers/CustomerControllerTest.java +++ b/batch-boot-jpa-sample/src/test/java/com/example/bootbatchjpa/web/controllers/CustomerControllerTest.java @@ -26,11 +26,11 @@ 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.test.mock.mockito.MockBean; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.http.MediaType; import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.MockMvc; @WebMvcTest(controllers = CustomerController.class) @@ -39,7 +39,7 @@ class CustomerControllerTest { @Autowired private MockMvc mockMvc; - @MockBean private CustomerService customerService; + @MockitoBean private CustomerService customerService; @Autowired private ObjectMapper objectMapper;