在Spring Batch的单个步骤单元测试期间,如何模拟自定义JdbcCursorItemReader?

时间:2019-02-15 16:49:41

标签: spring-boot spring-batch

我正在尝试创建一个Junit测试用例,以测试批处理Job的单个步骤,该步骤又具有自定义JdbcCursorItemReader并将数据写入Flat文件。我无法模拟可注入处理器以将其写入Flatfile的数据。请帮忙。

我按照下面的链接中的步骤创建了一个测试用例,以启动一个单独的步骤:

https://docs.spring.io/spring-batch/trunk/reference/html/testing.html

由于我的阅读器组件是步进镜,因此我使用上述链接中的10.4节中的上下文将所需的域对象放入ExecutionContext中,但是在启动该步骤时,它无法识别相同的内容,而是执行实际的SQL查询我是通过config xml注入的。

我的配置xml的步骤如下:

<step id="sample-step" next="next-step">
 <tasklet>
    <chunk reader="customJDBCReader" processor="customProcessor" 
     writer="customFlatFileItemWriter" commit-interval="XXX" />
 </tasklet>
</step>

我的customreader实现了JdbcCursorItemReader,该private StepExecution execution; @BeforeStep public StepExecution getStepExection() { execution = MetaDataInstanceFactory.createStepExecution(); return execution; } @Test public void testSampleStep() throws UnexpectedInputException, ParseException, Exception { MyDomainObject domainObject= new MyDomainObject (); domainObject.setID("sampleID"); domainObject.setName("sampleName"); domainObject.setImage("sampleImage"); execution.getExecutionContext().put("someKey", domainObject); execution.setReadCount(1); JobExecution jobExecution = jobLauncherTestUtils.launchStep("sample-step", jobParameters, execution.getExecutionContext()); AssertFile.assertFileEquals(new FileSystemResource(EXPECTED_FILE), new FileSystemResource(OUTPUT_FILE)); } 定义了一个用于从数据库读取信息的SQL。

在单元测试期间,我试图模拟数据,而不是依赖于数据库中的实际数据

executionContext

预期结果应该是启动步骤需要从if (!requireNamespace("remotes") { install.packages("remotes") } remotes::install_github("jacob-long/interactions") 获取数据,而不是从数据库将数据写入faltfile。

1 个答案:

答案 0 :(得分:0)

您的期望是错误的。如果该步骤使用JdbcBatchItemWriter,则无论是否在执行上下文中模拟数据,不管,该读取器仍会在测试期间发出SQL查询。步骤的输入数据与执行上下文中存储的数据不同。

在这种情况下,我建议在测试中使用嵌入式数据库,并在其中填充一些虚拟数据。

希望这会有所帮助。