Spring Batch 6.0.2迁移后用JobOperatorTestUtils写E2E测试遇Bean实例化问题
问题原因
Spring Batch 6.0+版本不再自动注册JobOperator Bean,而JobOperatorTestUtils依赖该Bean才能完成实例化。你的配置中既未启用完整的Spring Batch核心配置,也未手动定义JobOperator Bean,导致容器无法找到符合条件的依赖,从而报错。
解决方案
1. 启用Spring Batch核心配置
在BatchConfig类上添加@EnableBatchProcessing注解,该注解会自动注册JobRegistry、JobExplorer等Batch核心组件:
@Configuration @EnableBatchProcessing // 新增该注解 public class BatchConfig { // 原有代码保持不变 }
2. 添加Job自动注册处理器
新增JobRegistryBeanPostProcessor Bean,自动将你定义的Job注册到JobRegistry中,确保JobOperator能找到目标作业:
@Bean public JobRegistryBeanPostProcessor jobRegistryBeanPostProcessor(JobRegistry jobRegistry) { JobRegistryBeanPostProcessor postProcessor = new JobRegistryBeanPostProcessor(); postProcessor.setJobRegistry(jobRegistry); return postProcessor; }
3. 手动定义JobOperator Bean
注入Spring Boot自动配置的JobExplorer、JobLauncher、JobRepository等依赖,创建JobOperator实例:
@Bean public JobOperator jobOperator(JobExplorer jobExplorer, JobLauncher jobLauncher, JobRepository jobRepository, JobRegistry jobRegistry) { SimpleJobOperator jobOperator = new SimpleJobOperator(); jobOperator.setJobExplorer(jobExplorer); jobOperator.setJobLauncher(jobLauncher); jobOperator.setJobRepository(jobRepository); jobOperator.setJobRegistry(jobRegistry); return jobOperator; }
修改后的完整BatchConfig代码
package com.example.demo; import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; import org.springframework.batch.core.job.Job; import org.springframework.batch.core.job.builder.JobBuilder; import org.springframework.batch.core.launch.JobOperator; import org.springframework.batch.core.launch.support.SimpleJobOperator; 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.core.configuration.support.JobRegistryBeanPostProcessor; import org.springframework.batch.core.launch.JobRegistry; import org.springframework.batch.core.launch.JobExplorer; import org.springframework.batch.core.launch.JobLauncher; import org.springframework.batch.infrastructure.item.ItemProcessor; import org.springframework.batch.infrastructure.item.ItemReader; import org.springframework.batch.infrastructure.item.ItemWriter; import org.springframework.batch.infrastructure.item.support.ListItemReader; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.PlatformTransactionManager; import java.util.Arrays; import java.util.List; @Configuration @EnableBatchProcessing public class BatchConfig { @Bean public ItemReader<String> itemReader() { List<String> items = Arrays.asList("Item1", "Item2", "Item3"); return new ListItemReader<>(items); } @Bean public ItemProcessor<String, String> itemProcessor() { return String::toUpperCase; } @Bean public ItemWriter<String> itemWriter() { return items -> items.forEach(System.out::println); } @Bean public Step step(JobRepository jobRepository, PlatformTransactionManager transactionManager) { return new StepBuilder("step", jobRepository) .<String, String>chunk(1) .reader(itemReader()) .processor(itemProcessor()) .writer(itemWriter()) .transactionManager(transactionManager) .build(); } @Bean public Job job(JobRepository jobRepository, Step step) { return new JobBuilder("job", jobRepository) .start(step) .build(); } @Bean public JobRegistryBeanPostProcessor jobRegistryBeanPostProcessor(JobRegistry jobRegistry) { JobRegistryBeanPostProcessor postProcessor = new JobRegistryBeanPostProcessor(); postProcessor.setJobRegistry(jobRegistry); return postProcessor; } @Bean public JobOperator jobOperator(JobExplorer jobExplorer, JobLauncher jobLauncher, JobRepository jobRepository, JobRegistry jobRegistry) { SimpleJobOperator jobOperator = new SimpleJobOperator(); jobOperator.setJobExplorer(jobExplorer); jobOperator.setJobLauncher(jobLauncher); jobOperator.setJobRepository(jobRepository); jobOperator.setJobRegistry(jobRegistry); return jobOperator; } }
测试类说明
你的BatchConfigTest代码无需修改,现在Spring容器会正确实例化JobOperator,进而成功注入JobOperatorTestUtils,测试可以正常执行。
内容的提问来源于stack exchange,提问作者Vinod Somu
相关产品推荐
相关产品推荐

