使用@SpringBatchTest无数据源时创建jobRepositoryTestUtils报错如何解决
解决方案
方案1:弃用@SpringBatchTest,手动注册JobLauncherTestUtils
@SpringBatchTest默认会自动注册JobLauncherTestUtils、JobRepositoryTestUtils两个工具类,如果你只需要前者,完全可以跳过这个注解,手动声明需要的Bean即可,示例代码如下:
@SpringBootTest // 导入你自己的批处理配置类 @Import(MyBatchConfig.class) public class MyBatchJobTest { // 手动注册JobLauncherTestUtils @Bean public JobLauncherTestUtils jobLauncherTestUtils(Job job, JobLauncher jobLauncher) { JobLauncherTestUtils testUtils = new JobLauncherTestUtils(); testUtils.setJob(job); testUtils.setJobLauncher(jobLauncher); return testUtils; } @Autowired private JobLauncherTestUtils jobLauncherTestUtils; // 编写测试逻辑 @Test void testJobExecution() throws Exception { JobExecution execution = jobLauncherTestUtils.launchJob(); assertEquals(BatchStatus.COMPLETED, execution.getStatus()); } }
这个方案完全不会触发JobRepositoryTestUtils的实例化,从根源避免数据源依赖问题。
方案2:继续使用@SpringBatchTest,排除JobRepositoryTestUtils自动配置
如果你需要用到@SpringBatchTest提供的其他能力(比如JobScope的测试支持),可以排除掉JobRepositoryTestUtils的自动配置类,避免该Bean实例化:
@SpringBatchTest @SpringBootTest @EnableAutoConfiguration(exclude = org.springframework.batch.test.autoconfigure.JobRepositoryTestUtilsAutoConfiguration.class) public class MyBatchJobTest { @Autowired private JobLauncherTestUtils jobLauncherTestUtils; // 测试逻辑 }
注意:该配置适用于Spring Batch 5.x版本,低版本可通过@ComponentScan的排除规则过滤JobRepositoryTestUtils类型的Bean
方案3:配置内存数据源兼容全量测试能力
如果你后续可能用到JobRepositoryTestUtils的能力,可以直接引入嵌入式内存数据源(比如H2),不需要修改任何测试注解,即可满足依赖要求:
- 新增H2依赖(以Maven为例)
<dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>test</scope> </dependency>
- 在测试配置文件
application-test.properties中添加数据源配置
spring.datasource.driver-class-name=org.h2.Driver spring.datasource.url=jdbc:h2:mem:batchtestdb;DB_CLOSE_DELAY=-1 spring.datasource.username=sa spring.datasource.password=
Spring Batch会自动识别内存数据源并初始化批处理所需的元数据表,所有测试工具类都可以正常工作。
方案4:配置无数据源的内存版JobRepository
如果你的业务批处理本身就是无数据源设计,用MapJobRepositoryFactoryBean创建内存实现的JobRepository,即可满足JobRepositoryTestUtils的依赖要求,不需要引入额外数据源:
@TestConfiguration public class TestBatchConfig { @Bean public MapJobRepositoryFactoryBean mapJobRepository() { MapJobRepositoryFactoryBean factory = new MapJobRepositoryFactoryBean(new ResourcelessTransactionManager()); return factory; } }
将该配置类导入到测试类中即可。
内容的提问来源于stack exchange,提问作者Houssem Selmi
相关产品推荐
相关产品推荐

