From 81db52063a1f7eb251df129402669aab49f6fc82 Mon Sep 17 00:00:00 2001 From: Yanming Zhou Date: Thu, 20 Mar 2025 16:24:34 +0800 Subject: [PATCH 1/2] Polishing BatchAutoConfigurationTests 1. Rename `TestConfiguration` to `TestJpaConfiguration` and remove unnecessary reference. 2. Use `withBean` instead of `withUserConfiguration` to avoid new configuration class. 3. Use kebab-case for configuration key See gh-44800 Signed-off-by: Yanming Zhou --- .../batch/BatchAutoConfigurationTests.java | 137 ++++++++---------- 1 file changed, 59 insertions(+), 78 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfigurationTests.java index 584f43fa9ad..8774724d718 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfigurationTests.java @@ -113,23 +113,22 @@ class BatchAutoConfigurationTests { @Test void testDefaultContext() { - this.contextRunner.withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class) - .run((context) -> { - assertThat(context).hasSingleBean(JobRepository.class); - assertThat(context).hasSingleBean(JobLauncher.class); - assertThat(context).hasSingleBean(JobExplorer.class); - assertThat(context).hasSingleBean(JobRegistry.class); - assertThat(context).hasSingleBean(JobOperator.class); - assertThat(context.getBean(BatchProperties.class).getJdbc().getInitializeSchema()) - .isEqualTo(DatabaseInitializationMode.EMBEDDED); - assertThat(new JdbcTemplate(context.getBean(DataSource.class)) - .queryForList("select * from BATCH_JOB_EXECUTION")).isEmpty(); - }); + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class).run((context) -> { + assertThat(context).hasSingleBean(JobRepository.class); + assertThat(context).hasSingleBean(JobLauncher.class); + assertThat(context).hasSingleBean(JobExplorer.class); + assertThat(context).hasSingleBean(JobRegistry.class); + assertThat(context).hasSingleBean(JobOperator.class); + assertThat(context.getBean(BatchProperties.class).getJdbc().getInitializeSchema()) + .isEqualTo(DatabaseInitializationMode.EMBEDDED); + assertThat(new JdbcTemplate(context.getBean(DataSource.class)) + .queryForList("select * from BATCH_JOB_EXECUTION")).isEmpty(); + }); } @Test void autoconfigurationBacksOffEntirelyIfSpringJdbcAbsent() { - this.contextRunner.withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class) + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) .withClassLoader(new FilteredClassLoader(DatabasePopulator.class)) .run((context) -> { assertThat(context).doesNotHaveBean(JobLauncherApplicationRunner.class); @@ -253,7 +252,7 @@ class BatchAutoConfigurationTests { @Test void testDisableSchemaLoader() { - this.contextRunner.withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class) + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) .withPropertyValues("spring.datasource.generate-unique-name=true", "spring.batch.jdbc.initialize-schema:never") .run((context) -> { @@ -270,7 +269,7 @@ class BatchAutoConfigurationTests { @Test void testUsingJpa() { this.contextRunner - .withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class, + .withUserConfiguration(TestJpaConfiguration.class, EmbeddedDataSourceConfiguration.class, HibernateJpaAutoConfiguration.class) .run((context) -> { PlatformTransactionManager transactionManager = context.getBean(PlatformTransactionManager.class); @@ -288,11 +287,9 @@ class BatchAutoConfigurationTests { @Test @WithPackageResources("custom-schema.sql") void testRenamePrefix() { - this.contextRunner - .withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class, - HibernateJpaAutoConfiguration.class) + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) .withPropertyValues("spring.datasource.generate-unique-name=true", - "spring.batch.jdbc.schema:classpath:custom-schema.sql", "spring.batch.jdbc.tablePrefix:PREFIX_") + "spring.batch.jdbc.schema:classpath:custom-schema.sql", "spring.batch.jdbc.table-prefix:PREFIX_") .run((context) -> { assertThat(context).hasSingleBean(JobLauncher.class); assertThat(context.getBean(BatchProperties.class).getJdbc().getInitializeSchema()) @@ -309,7 +306,7 @@ class BatchAutoConfigurationTests { @Test void testCustomizeJpaTransactionManagerUsingProperties() { this.contextRunner - .withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class, + .withUserConfiguration(TestJpaConfiguration.class, EmbeddedDataSourceConfiguration.class, HibernateJpaAutoConfiguration.class) .withPropertyValues("spring.transaction.default-timeout:30", "spring.transaction.rollback-on-commit-failure:true") @@ -324,7 +321,7 @@ class BatchAutoConfigurationTests { @Test void testCustomizeDataSourceTransactionManagerUsingProperties() { - this.contextRunner.withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class) + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) .withPropertyValues("spring.transaction.default-timeout:30", "spring.transaction.rollback-on-commit-failure:true") .run((context) -> { @@ -338,49 +335,44 @@ class BatchAutoConfigurationTests { @Test void testBatchDataSource() { - this.contextRunner.withUserConfiguration(TestConfiguration.class, BatchDataSourceConfiguration.class) - .run((context) -> { - assertThat(context).hasSingleBean(SpringBootBatchConfiguration.class) - .hasSingleBean(BatchDataSourceScriptDatabaseInitializer.class) - .hasBean("batchDataSource"); - DataSource batchDataSource = context.getBean("batchDataSource", DataSource.class); - assertThat(context.getBean(SpringBootBatchConfiguration.class).getDataSource()) - .isEqualTo(batchDataSource); - assertThat(context.getBean(BatchDataSourceScriptDatabaseInitializer.class)) - .hasFieldOrPropertyWithValue("dataSource", batchDataSource); - }); + this.contextRunner.withUserConfiguration(BatchDataSourceConfiguration.class).run((context) -> { + assertThat(context).hasSingleBean(SpringBootBatchConfiguration.class) + .hasSingleBean(BatchDataSourceScriptDatabaseInitializer.class) + .hasBean("batchDataSource"); + DataSource batchDataSource = context.getBean("batchDataSource", DataSource.class); + assertThat(context.getBean(SpringBootBatchConfiguration.class).getDataSource()).isEqualTo(batchDataSource); + assertThat(context.getBean(BatchDataSourceScriptDatabaseInitializer.class)) + .hasFieldOrPropertyWithValue("dataSource", batchDataSource); + }); } @Test void testBatchTransactionManager() { - this.contextRunner.withUserConfiguration(TestConfiguration.class, BatchTransactionManagerConfiguration.class) - .run((context) -> { - assertThat(context).hasSingleBean(SpringBootBatchConfiguration.class); - PlatformTransactionManager batchTransactionManager = context.getBean("batchTransactionManager", - PlatformTransactionManager.class); - assertThat(context.getBean(SpringBootBatchConfiguration.class).getTransactionManager()) - .isEqualTo(batchTransactionManager); - }); + this.contextRunner.withUserConfiguration(BatchTransactionManagerConfiguration.class).run((context) -> { + assertThat(context).hasSingleBean(SpringBootBatchConfiguration.class); + PlatformTransactionManager batchTransactionManager = context.getBean("batchTransactionManager", + PlatformTransactionManager.class); + assertThat(context.getBean(SpringBootBatchConfiguration.class).getTransactionManager()) + .isEqualTo(batchTransactionManager); + }); } @Test void jobRepositoryBeansDependOnBatchDataSourceInitializer() { - this.contextRunner.withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class) - .run((context) -> { - ConfigurableListableBeanFactory beanFactory = context.getBeanFactory(); - String[] jobRepositoryNames = beanFactory.getBeanNamesForType(JobRepository.class); - assertThat(jobRepositoryNames).isNotEmpty(); - for (String jobRepositoryName : jobRepositoryNames) { - assertThat(beanFactory.getBeanDefinition(jobRepositoryName).getDependsOn()) - .contains("batchDataSourceInitializer"); - } - }); + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class).run((context) -> { + ConfigurableListableBeanFactory beanFactory = context.getBeanFactory(); + String[] jobRepositoryNames = beanFactory.getBeanNamesForType(JobRepository.class); + assertThat(jobRepositoryNames).isNotEmpty(); + for (String jobRepositoryName : jobRepositoryNames) { + assertThat(beanFactory.getBeanDefinition(jobRepositoryName).getDependsOn()) + .contains("batchDataSourceInitializer"); + } + }); } @Test void jobRepositoryBeansDependOnFlyway() { - this.contextRunner.withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class) - .withUserConfiguration(FlywayAutoConfiguration.class) + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class, FlywayAutoConfiguration.class) .withPropertyValues("spring.batch.initialize-schema=never") .run((context) -> { ConfigurableListableBeanFactory beanFactory = context.getBeanFactory(); @@ -396,8 +388,8 @@ class BatchAutoConfigurationTests { @Test @WithResource(name = "db/changelog/db.changelog-master.yaml", content = "databaseChangeLog:") void jobRepositoryBeansDependOnLiquibase() { - this.contextRunner.withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class) - .withUserConfiguration(LiquibaseAutoConfiguration.class) + this.contextRunner + .withUserConfiguration(EmbeddedDataSourceConfiguration.class, LiquibaseAutoConfiguration.class) .withPropertyValues("spring.batch.initialize-schema=never") .run((context) -> { ConfigurableListableBeanFactory beanFactory = context.getBeanFactory(); @@ -411,8 +403,7 @@ class BatchAutoConfigurationTests { @Test void whenTheUserDefinesTheirOwnBatchDatabaseInitializerThenTheAutoConfiguredInitializerBacksOff() { - this.contextRunner - .withUserConfiguration(TestConfiguration.class, CustomBatchDatabaseInitializerConfiguration.class) + this.contextRunner.withUserConfiguration(CustomBatchDatabaseInitializerConfiguration.class) .withConfiguration(AutoConfigurations.of(DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class)) .run((context) -> assertThat(context).hasSingleBean(BatchDataSourceScriptDatabaseInitializer.class) @@ -422,7 +413,7 @@ class BatchAutoConfigurationTests { @Test void whenTheUserDefinesTheirOwnDatabaseInitializerThenTheAutoConfiguredBatchInitializerRemains() { - this.contextRunner.withUserConfiguration(TestConfiguration.class, CustomDatabaseInitializerConfiguration.class) + this.contextRunner.withUserConfiguration(CustomDatabaseInitializerConfiguration.class) .withConfiguration(AutoConfigurations.of(DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class)) .run((context) -> assertThat(context).hasSingleBean(BatchDataSourceScriptDatabaseInitializer.class) @@ -431,8 +422,9 @@ class BatchAutoConfigurationTests { @Test void conversionServiceCustomizersAreCalled() { - this.contextRunner.withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class) - .withUserConfiguration(ConversionServiceCustomizersConfiguration.class) + this.contextRunner + .withUserConfiguration(EmbeddedDataSourceConfiguration.class, + ConversionServiceCustomizersConfiguration.class) .run((context) -> { BatchConversionServiceCustomizer customizer = context.getBean("batchConversionServiceCustomizer", BatchConversionServiceCustomizer.class); @@ -481,8 +473,8 @@ class BatchAutoConfigurationTests { @Test void customExecutionContextSerializerIsUsed() { - this.contextRunner.withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class) - .withUserConfiguration(CustomExecutionContextConfiguration.class) + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class) + .withBean(ExecutionContextSerializer.class, Jackson2ExecutionContextStringSerializer::new) .run((context) -> { assertThat(context).hasSingleBean(Jackson2ExecutionContextStringSerializer.class); assertThat(context.getBean(SpringBootBatchConfiguration.class).getExecutionContextSerializer()) @@ -492,12 +484,11 @@ class BatchAutoConfigurationTests { @Test void defaultExecutionContextSerializerIsUsed() { - this.contextRunner.withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class) - .run((context) -> { - assertThat(context).doesNotHaveBean(ExecutionContextSerializer.class); - assertThat(context.getBean(SpringBootBatchConfiguration.class).getExecutionContextSerializer()) - .isInstanceOf(DefaultExecutionContextSerializer.class); - }); + this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class).run((context) -> { + assertThat(context).doesNotHaveBean(ExecutionContextSerializer.class); + assertThat(context.getBean(SpringBootBatchConfiguration.class).getExecutionContextSerializer()) + .isInstanceOf(DefaultExecutionContextSerializer.class); + }); } private JobLauncherApplicationRunner createInstance(String... registeredJobNames) { @@ -560,7 +551,7 @@ class BatchAutoConfigurationTests { } @TestAutoConfigurationPackage(City.class) - static class TestConfiguration { + static class TestJpaConfiguration { } @@ -838,14 +829,4 @@ class BatchAutoConfigurationTests { } - @Configuration(proxyBeanMethods = false) - static class CustomExecutionContextConfiguration { - - @Bean - ExecutionContextSerializer executionContextSerializer() { - return new Jackson2ExecutionContextStringSerializer(); - } - - } - } From 1a608b70052c0a564a14e7baea9914f3b3f9d132 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Fri, 21 Mar 2025 08:14:17 +0100 Subject: [PATCH 2/2] Add Yanming to the list of contributors See gh-44800 --- .../boot/autoconfigure/batch/BatchAutoConfigurationTests.java | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfigurationTests.java index 8774724d718..b9017c76383 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfigurationTests.java @@ -103,6 +103,7 @@ import static org.mockito.Mockito.mock; * @author Mahmoud Ben Hassine * @author Lars Uffmann * @author Lasse Wulff + * @author Yanming Zhou */ @ExtendWith(OutputCaptureExtension.class) class BatchAutoConfigurationTests {