我正在尝试创建一个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。
答案 0 :(得分:0)
您的期望是错误的。如果该步骤使用JdbcBatchItemWriter
,则无论是否在执行上下文中模拟数据,不管,该读取器仍会在测试期间发出SQL查询。步骤的输入数据与执行上下文中存储的数据不同。
在这种情况下,我建议在测试中使用嵌入式数据库,并在其中填充一些虚拟数据。
希望这会有所帮助。