Я новичок в Spring Batch и начал разрабатывать простое пакетное приложение. Теперь я думаю о каком-нибудь модульном тестировании, которое может быть полезно для моего приложения и кода;)
Проблема в том, что я не смог найти в Интернете какой-либо ресурс (примеры, уроки...), который показывает, как выполнять модульное тестирование с помощью Spring Batch без использования XML.
Вот мой код, чтобы быть более понятным:
Класс конфигурации:
package my.company.project.name.batch.config
@Configuration
@EnableBatchProcessing
@ComponentScan({
"my.company.project.name.batch.reader",
"my.company.project.name.batch.tasklet",
"my.company.project.name.batch.processor",
"my.company.project.name.batch.writer"
})
@Import({CommonConfig.class})
public class MyItemBatchConfig {
@Autowired
private StepBuilderFactory steps;
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private MyItemTasklet myItemTasklet;
@Bean
public Job myItemJob(@Qualifier("myItem") Step loadProducts){
return jobBuilderFactory.get("myItemJob").start(myMethod).build();
}
@Bean(name= "myItem")
public Step myMethod(){
return steps.get("myItem").tasklet(myItemTasklet).build();
}
}
Класс MyItemReader:
package my.company.project.name.batch.reader
@Component
public class MyItemReader implements ItemReader<MyItem>{
@Value("${batch.load.produit.csv.file.path}")
private String csvFilePath;
private LinkedList<CsvRawLine> myItems;
@PostConstruct
public void init() {
myItems = new LinkedList<>(CsvUtil.getCsvReader(MyItem.class, csvFilePath));
}
@Override
public MyItem read() throws Exception{
return myItems.poll();
}
}
Класс ItemProcessor:
package my.company.project.name.batch.processor
@Component
public class MyItemProcessor implements ItemProcessor<MyItem, MyItemProcessorResult> {
public MyItemProcessorResult process(MyItemitem) throws Exception {
//processing business logic
}
}
Класс ItemWriter:
package my.company.project.name.batch.writer
@Component
public class MyItemWriter implements ItemWriter<MyItem> {
@Override
public void write(List<? extends MyItem> myItems) throws Exception {
//writer business logic
}
}
Класс MyItemTasklet, который будет вызывать все предыдущие классы для выполнения задачи, требуемой пакетом:
package package my.company.project.name.batch.tasklet
@Component
public class MyItemBatchTasklet implements Tasklet{
@Autowired
public MyItemReader myItemReader;
@Autowired
public MyItemProcessor myItemProcessor;
@Autowired
public MyItemeWriter myItemWriter;
@Override
public RepeatStatus execute execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
//calling myItemReader, myItemProcessor and myItemWriter to do the business logic
return RepeatStatus.FINISHED
}
}
MyItemTasklet, который запустит тасклет своим основным методом:
package package my.company.project.name.batch
public class MyItemTaskletLauncher{
public MyItemTaskletLauncher(){
//No implementation
}
public static void main (String[] args) throws IOException, JobExecutionException, NamingException {
Launcher.launchWithConfig("Launching MyItemTasklet ...", MyItemBatchConfig.class,false);
}
}