使用 Mockito 创建 Chunk Tasklet 的单元测试

我有Chunk Tasklet一个读者和作者,我正在尝试为其进行单元测试,但我面临多个问题。


它似乎最接近我想要做的。

@ContextConfiguration(locations = { "classpath:config/beans-unittest-service.xml",

        "classpath:config/beans-unittest-item.xml" })

@RunWith(SpringJUnit4ClassRunner.class)

public class KpiMetricFromCsvFileTaskletTest extends RegistryServiceImplTest {


    @Autowired

    @Qualifier("kpiMetricCsvItemReader")

    ItemReader<KpiMetric> reader;


    @Autowired

    @Qualifier("kpiMetricCreatorWriter")

    KpiMetricCreatorWriter writer;


    @Override

    @Before

    public void init() {

        writer.setRegistryService(registryService);

        writer.setRegistry(registry);

        setCreateKpiMeasureBehaviour();

    }


    private ChunkContext createChunkContext() {

        StepExecution stepExecution = Mockito.mock(StepExecution.class);

        StepContext stepContext = Mockito.mock(StepContext.class);

        ChunkContext chunkContext = Mockito.mock(ChunkContext.class);

        JobExecution jobExecution = MetaDataInstanceFactory.createJobExecution();


        Mockito.when(chunkContext.getStepContext()).thenReturn(stepContext);

        Mockito.when(stepContext.getStepExecution()).thenReturn(stepExecution);

        Mockito.when(stepExecution.getJobExecution()).thenReturn(jobExecution);


        return chunkContext;

    }

  • 我的单元测试Class扩展了另一个Class,其中包含将设置模拟对象行为的方法。

  • 我有两个配置文件。其中一个包含一个读取器 beankpiMetricCsvItemReader和一个写入器 bean kpiMetricCreatorWriter

  • 在我的单元测试init方法中,我将编写器的服务属性更改为模拟服务对象,我还模拟上下文对象,就像上面链接的答案一样。

问题是,在该testTasklet方法中,我想创建一个 Tasklet 并执行它,但是当我运行程序时,出现错误:

org.springframework.batch.item.ReaderNotOpenException:Reader 必须打开才能读取。

我知道该文件未打开,但是当我使用 Spring Batch 启动我的作业时,我没有收到该错误,因此 Spring 应该自行打开我的文件。

现在为了解决这个问题,我应该设法为读者打开文件,或者将微线程的创建委托给其他可以处理它的东西,但是如何呢?


白猪掌柜的
浏览 155回答 1
1回答

缥缈止盈

当在面向块的步骤之外使用时,应手动打开/关闭项目读取器/写入器。因此,就您的情况而言,您需要先自行打开阅读器,然后再使用它来读取数据。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java