Merge branch '3.4.x'

Closes gh-44829
This commit is contained in:
Stéphane Nicoll 2025-03-21 08:29:47 +01:00
commit 09e19fdb9b
1 changed files with 60 additions and 80 deletions

View File

@ -122,23 +122,22 @@ class BatchAutoConfigurationTests {
@Test @Test
void testDefaultContext() { void testDefaultContext() {
this.contextRunner.withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class) this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class).run((context) -> {
.run((context) -> { assertThat(context).hasSingleBean(JobRepository.class);
assertThat(context).hasSingleBean(JobRepository.class); assertThat(context).hasSingleBean(JobLauncher.class);
assertThat(context).hasSingleBean(JobLauncher.class); assertThat(context).hasSingleBean(JobExplorer.class);
assertThat(context).hasSingleBean(JobExplorer.class); assertThat(context).hasSingleBean(JobRegistry.class);
assertThat(context).hasSingleBean(JobRegistry.class); assertThat(context).hasSingleBean(JobOperator.class);
assertThat(context).hasSingleBean(JobOperator.class); assertThat(context.getBean(BatchProperties.class).getJdbc().getInitializeSchema())
assertThat(context.getBean(BatchProperties.class).getJdbc().getInitializeSchema()) .isEqualTo(DatabaseInitializationMode.EMBEDDED);
.isEqualTo(DatabaseInitializationMode.EMBEDDED); assertThat(new JdbcTemplate(context.getBean(DataSource.class))
assertThat(new JdbcTemplate(context.getBean(DataSource.class)) .queryForList("select * from BATCH_JOB_EXECUTION")).isEmpty();
.queryForList("select * from BATCH_JOB_EXECUTION")).isEmpty(); });
});
} }
@Test @Test
void autoconfigurationBacksOffEntirelyIfSpringJdbcAbsent() { void autoconfigurationBacksOffEntirelyIfSpringJdbcAbsent() {
this.contextRunner.withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class) this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class)
.withClassLoader(new FilteredClassLoader(DatabasePopulator.class)) .withClassLoader(new FilteredClassLoader(DatabasePopulator.class))
.run((context) -> { .run((context) -> {
assertThat(context).doesNotHaveBean(JobLauncherApplicationRunner.class); assertThat(context).doesNotHaveBean(JobLauncherApplicationRunner.class);
@ -262,7 +261,7 @@ class BatchAutoConfigurationTests {
@Test @Test
void testDisableSchemaLoader() { void testDisableSchemaLoader() {
this.contextRunner.withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class) this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class)
.withPropertyValues("spring.datasource.generate-unique-name=true", .withPropertyValues("spring.datasource.generate-unique-name=true",
"spring.batch.jdbc.initialize-schema:never") "spring.batch.jdbc.initialize-schema:never")
.run((context) -> { .run((context) -> {
@ -279,7 +278,7 @@ class BatchAutoConfigurationTests {
@Test @Test
void testUsingJpa() { void testUsingJpa() {
this.contextRunner this.contextRunner
.withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class, .withUserConfiguration(TestJpaConfiguration.class, EmbeddedDataSourceConfiguration.class,
HibernateJpaAutoConfiguration.class) HibernateJpaAutoConfiguration.class)
.run((context) -> { .run((context) -> {
PlatformTransactionManager transactionManager = context.getBean(PlatformTransactionManager.class); PlatformTransactionManager transactionManager = context.getBean(PlatformTransactionManager.class);
@ -297,11 +296,9 @@ class BatchAutoConfigurationTests {
@Test @Test
@WithPackageResources("custom-schema.sql") @WithPackageResources("custom-schema.sql")
void testRenamePrefix() { void testRenamePrefix() {
this.contextRunner this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class)
.withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class,
HibernateJpaAutoConfiguration.class)
.withPropertyValues("spring.datasource.generate-unique-name=true", .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) -> { .run((context) -> {
assertThat(context).hasSingleBean(JobLauncher.class); assertThat(context).hasSingleBean(JobLauncher.class);
assertThat(context.getBean(BatchProperties.class).getJdbc().getInitializeSchema()) assertThat(context.getBean(BatchProperties.class).getJdbc().getInitializeSchema())
@ -318,7 +315,7 @@ class BatchAutoConfigurationTests {
@Test @Test
void testCustomizeJpaTransactionManagerUsingProperties() { void testCustomizeJpaTransactionManagerUsingProperties() {
this.contextRunner this.contextRunner
.withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class, .withUserConfiguration(TestJpaConfiguration.class, EmbeddedDataSourceConfiguration.class,
HibernateJpaAutoConfiguration.class) HibernateJpaAutoConfiguration.class)
.withPropertyValues("spring.transaction.default-timeout:30", .withPropertyValues("spring.transaction.default-timeout:30",
"spring.transaction.rollback-on-commit-failure:true") "spring.transaction.rollback-on-commit-failure:true")
@ -333,7 +330,7 @@ class BatchAutoConfigurationTests {
@Test @Test
void testCustomizeDataSourceTransactionManagerUsingProperties() { void testCustomizeDataSourceTransactionManagerUsingProperties() {
this.contextRunner.withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class) this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class)
.withPropertyValues("spring.transaction.default-timeout:30", .withPropertyValues("spring.transaction.default-timeout:30",
"spring.transaction.rollback-on-commit-failure:true") "spring.transaction.rollback-on-commit-failure:true")
.run((context) -> { .run((context) -> {
@ -347,36 +344,32 @@ class BatchAutoConfigurationTests {
@Test @Test
void testBatchDataSource() { void testBatchDataSource() {
this.contextRunner.withUserConfiguration(TestConfiguration.class, BatchDataSourceConfiguration.class) this.contextRunner.withUserConfiguration(BatchDataSourceConfiguration.class).run((context) -> {
.run((context) -> { assertThat(context).hasSingleBean(SpringBootBatchConfiguration.class)
assertThat(context).hasSingleBean(SpringBootBatchConfiguration.class) .hasSingleBean(BatchDataSourceScriptDatabaseInitializer.class)
.hasSingleBean(BatchDataSourceScriptDatabaseInitializer.class) .hasBean("batchDataSource");
.hasBean("batchDataSource"); DataSource batchDataSource = context.getBean("batchDataSource", DataSource.class);
DataSource batchDataSource = context.getBean("batchDataSource", DataSource.class); assertThat(context.getBean(SpringBootBatchConfiguration.class).getDataSource()).isEqualTo(batchDataSource);
assertThat(context.getBean(SpringBootBatchConfiguration.class).getDataSource()) assertThat(context.getBean(BatchDataSourceScriptDatabaseInitializer.class))
.isEqualTo(batchDataSource); .hasFieldOrPropertyWithValue("dataSource", batchDataSource);
assertThat(context.getBean(BatchDataSourceScriptDatabaseInitializer.class)) });
.hasFieldOrPropertyWithValue("dataSource", batchDataSource);
});
} }
@Test @Test
void testBatchTransactionManager() { void testBatchTransactionManager() {
this.contextRunner.withUserConfiguration(TestConfiguration.class, BatchTransactionManagerConfiguration.class) this.contextRunner.withUserConfiguration(BatchTransactionManagerConfiguration.class).run((context) -> {
.run((context) -> { assertThat(context).hasSingleBean(SpringBootBatchConfiguration.class);
assertThat(context).hasSingleBean(SpringBootBatchConfiguration.class); PlatformTransactionManager batchTransactionManager = context.getBean("batchTransactionManager",
PlatformTransactionManager batchTransactionManager = context.getBean("batchTransactionManager", PlatformTransactionManager.class);
PlatformTransactionManager.class); assertThat(context.getBean(SpringBootBatchConfiguration.class).getTransactionManager())
assertThat(context.getBean(SpringBootBatchConfiguration.class).getTransactionManager()) .isEqualTo(batchTransactionManager);
.isEqualTo(batchTransactionManager); });
});
} }
@Test @Test
void testBatchTaskExecutor() { void testBatchTaskExecutor() {
this.contextRunner this.contextRunner
.withUserConfiguration(TestConfiguration.class, BatchTaskExecutorConfiguration.class, .withUserConfiguration(BatchTaskExecutorConfiguration.class, EmbeddedDataSourceConfiguration.class)
EmbeddedDataSourceConfiguration.class)
.run((context) -> { .run((context) -> {
assertThat(context).hasSingleBean(SpringBootBatchConfiguration.class).hasBean("batchTaskExecutor"); assertThat(context).hasSingleBean(SpringBootBatchConfiguration.class).hasBean("batchTaskExecutor");
TaskExecutor batchTaskExecutor = context.getBean("batchTaskExecutor", TaskExecutor.class); TaskExecutor batchTaskExecutor = context.getBean("batchTaskExecutor", TaskExecutor.class);
@ -390,22 +383,20 @@ class BatchAutoConfigurationTests {
@Test @Test
void jobRepositoryBeansDependOnBatchDataSourceInitializer() { void jobRepositoryBeansDependOnBatchDataSourceInitializer() {
this.contextRunner.withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class) this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class).run((context) -> {
.run((context) -> { ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory(); String[] jobRepositoryNames = beanFactory.getBeanNamesForType(JobRepository.class);
String[] jobRepositoryNames = beanFactory.getBeanNamesForType(JobRepository.class); assertThat(jobRepositoryNames).isNotEmpty();
assertThat(jobRepositoryNames).isNotEmpty(); for (String jobRepositoryName : jobRepositoryNames) {
for (String jobRepositoryName : jobRepositoryNames) { assertThat(beanFactory.getBeanDefinition(jobRepositoryName).getDependsOn())
assertThat(beanFactory.getBeanDefinition(jobRepositoryName).getDependsOn()) .contains("batchDataSourceInitializer");
.contains("batchDataSourceInitializer"); }
} });
});
} }
@Test @Test
void jobRepositoryBeansDependOnFlyway() { void jobRepositoryBeansDependOnFlyway() {
this.contextRunner.withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class) this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class, FlywayAutoConfiguration.class)
.withUserConfiguration(FlywayAutoConfiguration.class)
.withPropertyValues("spring.batch.initialize-schema=never") .withPropertyValues("spring.batch.initialize-schema=never")
.run((context) -> { .run((context) -> {
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory(); ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
@ -421,8 +412,8 @@ class BatchAutoConfigurationTests {
@Test @Test
@WithResource(name = "db/changelog/db.changelog-master.yaml", content = "databaseChangeLog:") @WithResource(name = "db/changelog/db.changelog-master.yaml", content = "databaseChangeLog:")
void jobRepositoryBeansDependOnLiquibase() { void jobRepositoryBeansDependOnLiquibase() {
this.contextRunner.withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class) this.contextRunner
.withUserConfiguration(LiquibaseAutoConfiguration.class) .withUserConfiguration(EmbeddedDataSourceConfiguration.class, LiquibaseAutoConfiguration.class)
.withPropertyValues("spring.batch.initialize-schema=never") .withPropertyValues("spring.batch.initialize-schema=never")
.run((context) -> { .run((context) -> {
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory(); ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
@ -436,8 +427,7 @@ class BatchAutoConfigurationTests {
@Test @Test
void whenTheUserDefinesTheirOwnBatchDatabaseInitializerThenTheAutoConfiguredInitializerBacksOff() { void whenTheUserDefinesTheirOwnBatchDatabaseInitializerThenTheAutoConfiguredInitializerBacksOff() {
this.contextRunner this.contextRunner.withUserConfiguration(CustomBatchDatabaseInitializerConfiguration.class)
.withUserConfiguration(TestConfiguration.class, CustomBatchDatabaseInitializerConfiguration.class)
.withConfiguration(AutoConfigurations.of(DataSourceAutoConfiguration.class, .withConfiguration(AutoConfigurations.of(DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class)) DataSourceTransactionManagerAutoConfiguration.class))
.run((context) -> assertThat(context).hasSingleBean(BatchDataSourceScriptDatabaseInitializer.class) .run((context) -> assertThat(context).hasSingleBean(BatchDataSourceScriptDatabaseInitializer.class)
@ -447,7 +437,7 @@ class BatchAutoConfigurationTests {
@Test @Test
void whenTheUserDefinesTheirOwnDatabaseInitializerThenTheAutoConfiguredBatchInitializerRemains() { void whenTheUserDefinesTheirOwnDatabaseInitializerThenTheAutoConfiguredBatchInitializerRemains() {
this.contextRunner.withUserConfiguration(TestConfiguration.class, CustomDatabaseInitializerConfiguration.class) this.contextRunner.withUserConfiguration(CustomDatabaseInitializerConfiguration.class)
.withConfiguration(AutoConfigurations.of(DataSourceAutoConfiguration.class, .withConfiguration(AutoConfigurations.of(DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class)) DataSourceTransactionManagerAutoConfiguration.class))
.run((context) -> assertThat(context).hasSingleBean(BatchDataSourceScriptDatabaseInitializer.class) .run((context) -> assertThat(context).hasSingleBean(BatchDataSourceScriptDatabaseInitializer.class)
@ -456,8 +446,9 @@ class BatchAutoConfigurationTests {
@Test @Test
void conversionServiceCustomizersAreCalled() { void conversionServiceCustomizersAreCalled() {
this.contextRunner.withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class) this.contextRunner
.withUserConfiguration(ConversionServiceCustomizersConfiguration.class) .withUserConfiguration(EmbeddedDataSourceConfiguration.class,
ConversionServiceCustomizersConfiguration.class)
.run((context) -> { .run((context) -> {
BatchConversionServiceCustomizer customizer = context.getBean("batchConversionServiceCustomizer", BatchConversionServiceCustomizer customizer = context.getBean("batchConversionServiceCustomizer",
BatchConversionServiceCustomizer.class); BatchConversionServiceCustomizer.class);
@ -506,8 +497,8 @@ class BatchAutoConfigurationTests {
@Test @Test
void customExecutionContextSerializerIsUsed() { void customExecutionContextSerializerIsUsed() {
this.contextRunner.withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class) this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class)
.withUserConfiguration(CustomExecutionContextConfiguration.class) .withBean(ExecutionContextSerializer.class, Jackson2ExecutionContextStringSerializer::new)
.run((context) -> { .run((context) -> {
assertThat(context).hasSingleBean(Jackson2ExecutionContextStringSerializer.class); assertThat(context).hasSingleBean(Jackson2ExecutionContextStringSerializer.class);
assertThat(context.getBean(SpringBootBatchConfiguration.class).getExecutionContextSerializer()) assertThat(context.getBean(SpringBootBatchConfiguration.class).getExecutionContextSerializer())
@ -517,12 +508,11 @@ class BatchAutoConfigurationTests {
@Test @Test
void defaultExecutionContextSerializerIsUsed() { void defaultExecutionContextSerializerIsUsed() {
this.contextRunner.withUserConfiguration(TestConfiguration.class, EmbeddedDataSourceConfiguration.class) this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class).run((context) -> {
.run((context) -> { assertThat(context).doesNotHaveBean(ExecutionContextSerializer.class);
assertThat(context).doesNotHaveBean(ExecutionContextSerializer.class); assertThat(context.getBean(SpringBootBatchConfiguration.class).getExecutionContextSerializer())
assertThat(context.getBean(SpringBootBatchConfiguration.class).getExecutionContextSerializer()) .isInstanceOf(DefaultExecutionContextSerializer.class);
.isInstanceOf(DefaultExecutionContextSerializer.class); });
});
} }
@Test @Test
@ -634,7 +624,7 @@ class BatchAutoConfigurationTests {
} }
@TestAutoConfigurationPackage(City.class) @TestAutoConfigurationPackage(City.class)
static class TestConfiguration { static class TestJpaConfiguration {
} }
@ -912,14 +902,4 @@ class BatchAutoConfigurationTests {
} }
@Configuration(proxyBeanMethods = false)
static class CustomExecutionContextConfiguration {
@Bean
ExecutionContextSerializer executionContextSerializer() {
return new Jackson2ExecutionContextStringSerializer();
}
}
} }