Реализация тестовых случаев JUnit в пакетных заданиях Spring, вызываемых из контроллера - PullRequest
0 голосов
/ 18 февраля 2020

Я новичок в Junit. Я буквально изо всех сил пытаюсь написать тестовые примеры Junit для моего кода. Я работаю с Spring boot, Batch и JPA. Я настроил работу, файл для чтения и записи в БД все работает нормально. Но когда дело доходит до JUnit, у меня даже нет идеи написать код. Может кто-нибудь мне помочь. Ниже мой код

FileProcessController. java

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameter;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.sc.batchservice.model.StatusResponse;

import lombok.extern.slf4j.Slf4j;


@Slf4j
@RestController
@RequestMapping("/fileProcess")
public class FileProcessController {

    @Autowired
    private JobLauncher jobLauncher;

    @Autowired
    @Qualifier("euronetFileParseJob")
    private Job job;

    @GetMapping(path = "/process")
    public @ResponseBody StatusResponse process() throws Exception {
        try {
            Map<String, JobParameter> parameters = new HashMap<>();
            parameters.put("date", new JobParameter(new Date()));

            jobLauncher.run(job, new JobParameters(parameters));
            return new StatusResponse(true);

        } catch (Exception e) {
            log.error("Exception", e);
            Throwable rootException = ExceptionUtils.getRootCause(e);
            String errMessage = rootException.getMessage();
            log.info("Root cause is instance of JobInstanceAlreadyCompleteException --> "+(rootException instanceof JobInstanceAlreadyCompleteException));
            if(rootException instanceof JobInstanceAlreadyCompleteException){
                log.info(errMessage);
                return new StatusResponse(false, "This job has been completed already!");
            } else{
                throw e;
            }
        }
    }
}

BatchConfig. java

import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;

import com.sc.batchservice.model.DetailsDTO;

@Configuration
@EnableBatchProcessing
public class BatchConfig {

    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    public void setJobBuilderFactory(JobBuilderFactory jobBuilderFactory) {
        this.jobBuilderFactory = jobBuilderFactory;
    }

    @Autowired
    StepBuilderFactory stepBuilderFactory;

    @Value("file:${input.files.location}${input.file.pattern}")
    private Resource[] fileInputs;

    @Value("${euronet.file.column.names}")
    private String filecolumnNames;

    @Value("${euronet.file.column.lengths}")
    private String fileColumnLengths;

    @Value("${input.files.location}")
    private String inputFileLocation;

    @Value("${input.file.pattern}")
    private String inputFilePattern;

    @Autowired
    FlatFileWriter flatFileWriter;

    @Bean
    public Job euronetFileParseJob() {
        return jobBuilderFactory.get("euronetFileParseJob")
                .incrementer(new RunIdIncrementer())
                .start(fileStep())
                .build();
    }

    public Step fileStep() {
        return stepBuilderFactory.get("fileStep")
                .<DetailsDTO, DetailsDTO>chunk(10)
                .reader(new FlatFileReader(fileInputs, filecolumnNames, fileColumnLengths))
                .writer(flatFileWriter)
                .build();
    }

}

FlatFileReader. java

import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.MultiResourceItemReader;
import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper;
import org.springframework.batch.item.file.mapping.DefaultLineMapper;
import org.springframework.batch.item.file.mapping.FieldSetMapper;
import org.springframework.batch.item.file.transform.FixedLengthTokenizer;
import org.springframework.core.io.Resource;

import com.sc.batchservice.model.DetailsDTO;
import com.sc.batchservice.util.CommonUtil;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class FlatFileReader extends MultiResourceItemReader<DetailsDTO> {

    public EuronetFlatFileReader(Resource[] fileInputs, String filecolumnNames, String fileColumnLengths) {
        setResources(fileInputs);
        setDelegate(reader(filecolumnNames, fileColumnLengths));
        setStrict(true);
    }

    private FlatFileItemReader<DetailsDTO> reader(String filecolumnNames, String fileColumnLengths) {
        FlatFileItemReader<DetailsDTO> flatFileItemReader = new FlatFileItemReader<>();
        FixedLengthTokenizer tokenizer = CommonUtil.fixedLengthTokenizer(filecolumnNames, fileColumnLengths);
        FieldSetMapper<DetailsDTO> mapper = createMapper();
        DefaultLineMapper<DetailsDTO> lineMapper = new DefaultLineMapper<>();
        lineMapper.setLineTokenizer(tokenizer);
        lineMapper.setFieldSetMapper(mapper);
        flatFileItemReader.setLineMapper(lineMapper);
        return flatFileItemReader;
    }

    /*
     * Mapping column data to DTO
    */
    private FieldSetMapper<DetailsDTO> createMapper() {
        BeanWrapperFieldSetMapper<DetailsDTO> mapper = new BeanWrapperFieldSetMapper<>();
        try {
            mapper.setTargetType(DetailsDTO.class);
        } catch(Exception e) {
            log.error("Exception in mapping column data to dto ", e);
        }
        return mapper;
    }

}

У меня есть также классы Writer, Entity и model, но если есть какой-либо пример или идея этого кода, я могу приступить к этим классам.

...