我正在尝试测试我的自定义itemReader:
@Bean
@StepScope
MyMultiLineItemReader itemReader(@Value("#{stepExecutionContext['fileName']}") String filename) throws MalformedURLException {
MyMultiLineItemReader itemReader = new MyMultiLineItemReader();
itemReader.setDelegate(myFlatFileItemReader(filename));
return itemReader;
}
@Bean
@StepScope
public FlatFileItemReader<String> myFlatFileItemReader(@Value("#{stepExecutionContext['fileName']}") String filename) throws MalformedURLException {
return new FlatFileItemReaderBuilder<String>()
.name("myFlatFileItemReader")
.resource(new UrlResource(filename))
.lineMapper(new PassThroughLineMapper())
.build();
}
我的测试类看起来像
@Test
public void givenMockedStep_whenReaderCalled_thenSuccess() throws Exception {
// given
JobExecution jobExecution = new JobExecution(5l);
ExecutionContext ctx = new ExecutionContext();
ctx.put("fileName", "src/main/resources/data/input.txt");
jobExecution.setExecutionContext(ctx);
JobSynchronizationManager.register(jobExecution);
StepExecution stepExecution = MetaDataInstanceFactory.createStepExecution(ctx);
// when
StepScopeTestUtils.doInStepScope(stepExecution, () -> {
...
});
}
当我运行测试用例时,由于fileName参数为null,因此流程失败。
我正在寻找测试itemReader的正确方法。
谢谢
1条答案
按热度按时间9jyewag01#
你不需要创建一个JobExecution并在
JobSynchronizationManager
中注册它来测试一个step-scoped组件。模拟一个step-execution并在StepScopeTestUtils.doInStepScope
中使用它就足够了。下面是一个完整的例子:假设类路径资源
data/input.txt
包含两行foo
和bar
,则此测试通过。