I’m writing tests for spring batch. But my test fails because it cannot find a JobRepository
bean from application context. I thought @SpringBatchTest
was supposed to load this bean but it doesn’t work. I added BatchAutoConfiguration.class
but didn’t work either
I have a basic Spring batch configuration :
@Configuration
public class ConfigBatch {
@Autowired
JobDurationListener jobDurationListener;
@Autowired
DataRepository repository;
@Bean
public ThreadPoolTaskExecutor taskExecutor() {
//create task executor
return executor;
}
@Bean
public DataItemWriter dataItemWriter(DataService dataService) {
return new DataItemWriter(dataService);
}
@Bean
public Job sampleJob(JobRepository jobRepository, Step sampleStep) {
return new JobBuilder("job", jobRepository)
.listener(jobDurationListener)
.start(step)
.build();
}
@Bean
public Step sampleStep(JobRepository jobRepository,
PlatformTransactionManager transactionManager, DataService dataService) {
return new StepBuilder("step", jobRepository)
.<Data, Data>chunk(10, transactionManager)
.reader(reader(analyseService))
.processor(asyncProcessor())
.writer(asyncWriter(dataService))
.build();
}
@Bean
public ItemProcessor<Data,Data> processor() {
return new ItemProcessor<Data, Data>() {
@Override
public Analyse process(Data item) throws Exception {
return data;
}
};
}
@Bean
public AsyncItemWriter<Data> asyncWriter(DataService dataService) {
var asyncWriter = new AsyncItemWriter<Data>();
asyncWriter.setDelegate(writer(dataService));
return asyncWriter;
}
@Bean
public AsyncItemProcessor asyncProcessor() {
var asyncProcessor = new AsyncItemProcessor<Data, Data>();
asyncProcessor.setDelegate(processor());
asyncProcessor.setTaskExecutor(taskExecutor());
return asyncProcessor;
}
@Bean
public ItemReader<Data> reader(DataService dataService) {
return new JpaAnalyseItemReader(dataService);
}
@Bean
public ItemWriter<Data> writer(DataService dataService) {
return new JpaAnalyseWriter(dataService);
}
}
Here is my test class :
@DataJpaTest
@Import({ConfigBatch.class, BatchAutoConfiguration.class})
@SpringBatchTest
public class BatchTest {
@Autowired
private JobLauncherTestUtils jobLauncherTestUtils;
@Autowired
private Job job;
@Test
void myTest() throws Exception {
jobLauncherTestUtils.setJob(job);
JobExecution jobExecution = jobLauncherTestUtils.launchJob();
assertEquals("COMPLETED", jobExecution.getExitStatus().getExitCode());
}
}