Spring Batch 5.0测试配置问题求助:JobLauncher缺失与表不存在
解决方案
1. 调整测试类注解配置
移除@JdbcTest和@EnableBatchProcessing,改用@SpringBootTest配合@SpringBatchTest与@AutoConfigureTestDatabase,让Spring Boot自动配置Spring Batch核心基础设施,并自动初始化嵌入式数据库的Batch元数据表:
@ExtendWith(MockitoExtension.class) @SpringBatchTest @SpringBootTest(classes = BatchProcessor.class) @ActiveProfiles("test") @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.ANY) public class BatchProcessorTest { @Autowired private JobLauncherTestUtils jobLauncherTestUtils; @Autowired private JobRepositoryTestUtils jobRepositoryTestUtils; private JobParameters setupJobParameters(String fileName) { JobParametersBuilder paramsBuilder = new JobParametersBuilder(); paramsBuilder.addString("inputfilename", fileName); return paramsBuilder.toJobParameters(); } @Test public void givenFileName_whenMatched_thenSuccess() throws Exception { jobLauncherTestUtils.launchStep(BatchProcessor.PRE_PROCESS_STEP, setupJobParameters("XXX")); } }
2. 修复BatchProcessor类的核心问题
(1)初始化未赋值的jobName字段
原类中jobName未赋值,会导致JobBuilder创建Job失败,可通过配置注入或直接指定默认值:
@Configuration public class BatchProcessor { public static final String PRE_PROCESS_STEP = "pre-process-step"; // 通过配置注入或直接指定默认job名称 @Value("${batch.job.name:data-processing-job}") protected String jobName; @Autowired protected PlatformTransactionManager transactionManager; @Autowired protected JobLauncher jobLauncher; @Autowired protected JobRepository jobRepository; @Autowired protected JobExplorer jobs; // 剩余Bean定义代码保留... }
(2)修正Tasklet的Job参数获取方式
原preProcess方法的@Value注入逻辑无效,Tasklet无法直接通过方法参数注入Job参数,需通过ChunkContext获取:
protected Tasklet preProcess() { return (contribution, chunkContext) -> { String fileName = chunkContext.getStepContext().getJobParameters().get("inputfilename").toString(); // 你的业务逻辑实现 return RepeatStatus.FINISHED; }; } // 对应的Step Bean修改为: @Bean protected Step preProcessStep() { return new StepBuilder(PRE_PROCESS_STEP, jobRepository) .tasklet(preProcess(), transactionManager) .build(); }
3. 异常原因说明
- 缺少JobLauncher异常:
@JdbcTest是Spring Boot切片测试注解,仅配置JDBC相关Bean,不会自动初始化Spring Batch的核心基础设施(JobLauncher、JobRepository等),导致依赖注入失败。 - Batch表不存在异常:Spring Batch 5中添加
@EnableBatchProcessing会禁用Spring Boot的自动配置,此时需要手动初始化Batch元数据表,但你未配置对应逻辑;而Spring Boot默认自动配置会针对嵌入式数据库自动执行Batch的DDL脚本,因此无需添加@EnableBatchProcessing。
内容的提问来源于stack exchange,提问作者ahgpoug
相关产品推荐
相关产品推荐

