我是春季批量应用程序的新手。我正在使用 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);
}
};
}
}
}
上述测试调用实际的批处理作业并执行数据库调用。我如何模拟数据库调用并测试批处理作业?请帮忙
上述测试调用实际的批处理作业并执行数据库调用。我如何模拟数据库调用并测试批处理作业?
这是因为测试使用的是 Spring Boot 在测试中自动配置的相同数据源。如果您确实需要模拟数据库调用,则需要定义一个模拟数据源并模拟对其的所有调用(如
getConnection()
等)。
仅供参考,oracle 为开发人员提供了一个免费版本,您可以使用它进行测试:https://www.oracle.com/database/free/get-started/#installing。我将使用该版本创建一个数据源进行测试。