使用 Mockito 进行 Spring 批量作业测试

问题描述 投票:0回答:1

我是春季批量应用程序的新手。我正在使用 Junit 和 mockito 为 spring 批处理作业编写测试用例。我尝试使用内存 DB 编写测试用例,但我们正在使用一些 Oracle 特定函数,因此不能在 mem H2 DB 中使用,因此决定使用 mockito 来模拟 DB来电。

我的批处理作业是从数据库读取并处理数据并写回数据库。

jobConfig.java

private final JdbcCursorItemReader<LimsExternalLinkDTO> findExternalLinksReader;

@Bean(name = VALIDATE_EXTERNAL_LINK_JOB)
public Job jobValidateExternalLinks() {
    return jobBuilderFactory.get(VALIDATE_EXTERNAL_LINK_JOB)
            .incrementer(new RunIdIncrementer())
            .start(stepValidateExternalLinks())
            .build();
}

@Bean
public Step stepValidateExternalLinks() {
    return stepBuilderFactory.get("stepValidateExternalLinks")
            .<LimsExternalLinkDTO, LimsExternalLinkDTO> chunk(VALIDATE_LINKS_BATCH_SIZE)
            .reader(validateExternalLinksReader)
            .processor(validateExternalLinksProcessor)
            .writer(jdbcBatchItemWriterValidateExternalLink)
            .build();
}

Reader.java

@Bean
     @StepScope
        public JdbcCursorItemReader<LimsExternalLinkDTO> validateExternalLinksReader(){
            JdbcCursorItemReader<LimsExternalLinkDTO> reader = new JdbcCursorItemReader<>();
            reader.setDataSource(dataSource);
            reader.setSql(GET_LINK_WHERE_STATUS_NULL);
            reader.setRowMapper(new BeanPropertyRowMapper<>(LimsExternalLinkDTO.class));
            reader.setFetchSize(BATCH_SIZE);
            reader.setQueryTimeout(REQUEST_TIMEOUT);
            return reader;
        }

writer.java

 @Bean
public JdbcBatchItemWriter<LimsExternalLinkDTO> jdbcBatchItemWriterValidateExternalLink(){
    JdbcBatchItemWriter<LimsExternalLinkDTO> jdbcBatchItemWriter = new JdbcBatchItemWriter<>();
    jdbcBatchItemWriter.setDataSource(dataSource);
    jdbcBatchItemWriter.setSql(UPDATE_LIMS_EXTERNAL_LINKS_QUERY);
    jdbcBatchItemWriter.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());
    return jdbcBatchItemWriter;
}

处理器.java

私有最终 LinkValidateService linkValidateService;

@Bean
public ItemProcessor<LimsExternalLinkDTO, LimsExternalLinkDTO> validateExternalLinksProcessor(){
    return linkData -> {
        System.out.println("processed data :"+linkData);
        linkData.setStatus(linkValidateService.validateLink(linkData.getExternalLink()) ? "VALID" : "INVALID");
        return linkData;
    };
}

jobConfigTest.java 我在 jobconfig 类中有多个作业

@SpringBootTest
@ContextConfiguration(classes= BatchStepTest.TestConfig.class)
//@SpringBatchTest
@SpringJUnitConfig({LimsReportApplication.class, JobConfiguration.class})
public class BatchStepTest {

    @Autowired
    private JobLauncherTestUtils jobLauncherTestUtils;

    @Autowired
    private JobRepositoryTestUtils jobRepositoryTestUtils;

    @BeforeEach
    void setUp() {

        jobRepositoryTestUtils.removeJobExecutions();
        Mockito.when()
    }

    @AfterEach
    void tearDown() {
    }

    @Test
    void testSTep() throws Exception {

        //WHEN
        int bookId = 316;
        JobParameters jobParameters = new JobParametersBuilder().addString("bookId", String.valueOf(bookId))
                .toJobParameters();
        JobExecution jobExecution = jobLauncherTestUtils.launchJob(jobParameters);

        //THEN
        Assertions.assertEquals(ExitStatus.COMPLETED,jobExecution.getExitStatus());
    }


    @TestConfiguration
    static class TestConfig extends BatchJobTestConfiguration {
        @Override
        @Bean
        JobLauncherTestUtils getJobLauncherTestUtils() {
            return new JobLauncherTestUtils() {
                @Override
                @Autowired
                public void setJob(@Qualifier("jobValidateExternalLinks") Job job) {
                    super.setJob(job);
                }
            };
        }
    }
}

上述测试调用实际的批处理作业并执行数据库调用。我如何模拟数据库调用并测试批处理作业?请帮忙

testing junit mockito spring-batch
1个回答
0
投票

上述测试调用实际的批处理作业并执行数据库调用。我如何模拟数据库调用并测试批处理作业?

这是因为测试使用的是 Spring Boot 在测试中自动配置的相同数据源。如果您确实需要模拟数据库调用,则需要定义一个模拟数据源并模拟对其的所有调用(如

getConnection()
等)。

仅供参考,oracle 为开发人员提供了一个免费版本,您可以使用它进行测试:https://www.oracle.com/database/free/get-started/#installing。我将使用该版本创建一个数据源进行测试。

© www.soinside.com 2019 - 2024. All rights reserved.