Модульное тестирование с использованием JUnit для Spring Batch без конфигурации XML

Я новичок в 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);
    }
}

person Ghassen    schedule 28.07.2017    source источник
comment
Знаете ли вы, как выполнять модульное тестирование с помощью Spring Batch при использовании XML?   -  person Sabir Khan    schedule 01.08.2017
comment
На самом деле нет, не знаю.   -  person Ghassen    schedule 02.08.2017


Ответы (1)


Я сделал простое пакетное приложение, используя Spring Batch, MyBatis и JUnit.

Тестовые коды приложения запускают модульное тестирование без XML.

Вот тестовый класс для работы.


@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = {xxx.class, yyy.class, zzz.class, xxxJobLauncherTestUtils.class})
public class JobTest {

    @Autowired
    @Qualifier(value = "xxxJobLauncherTestUtils")
    private JobLauncherTestUtils xxxJobLauncherTestUtils;

    @Test
    public void testXxxJob() throws Exception {
        JobExecution jobExecution = xxxJobLauncherTestUtils.launchJob();
        assertThat(jobExecution.getStatus(), is(BatchStatus.COMPLETED));
    }
}

@Component(value = "xxxJobLauncherTestUtils")
class XxxjobLauncherTestUtils extends JobLauncherTestUtils {

    @Autowired
    @Qualifier(value = "xxxJob")
    @Override
    public void setJob(Job job) {
        super.setJob(job);
    }
}

О деталях, пожалуйста, смотрите ссылку ниже.

https://github.com/Maeno/spring-batch-example/tree/master/src/test

Я надеюсь, что это будет полезно.

person user8528058    schedule 28.08.2017
comment
Предоставление ссылки на решение или пример кода — это хорошо, но было бы неплохо, если бы вы предоставили более подробную информацию о вопросе OP в своем ответе в дополнение к ссылке. - person Nima; 28.08.2017