如何测试 FlowJob 中的步骤

How to test a Step in a FlowJob

我正在尝试测试包含在作业中的流程中的步骤。这是基本的作业配置:

    Flow readFlow = new FlowBuilder<Flow>("readFlow").start(step01.deleteProcessedRecords()).on("*")
            .to(step02.retrieveIdentifiers())...end();

    Flow firstWriteFlow = new FlowBuilder<Flow>("firstWriteFlow").from(step04.createFirstFile()).end();


    FlowJobBuilder builder = new JobBuilder("createFiles").repository(jobRepository)
            .incrementer(new RunIdIncrementer())
            .start(readFlow)
            .on("*")
            .to(firstWriteFlow)
            .end(); 

我会让流程更复杂,为了举例,它们已经被简化了。当我执行以下测试时出现错误:

    JobParameters jobParameters = new JobParametersBuilder()
            .addString("runId", "Step01").toJobParameters();


    JobExecution exec = jobLauncherTestUtils
            .launchStep("deleteProcessedRecords", jobParameters);

错误:

java.lang.IllegalStateException: No Step found with name: [deleteProcessedRecords]

但是,如果我测试 Job,步骤显然在那里:

JobParameters jobParameters = new JobParametersBuilder()
            .addString("runId", "Step01").toJobParameters();


    JobExecution exec = jobLauncherTestUtils
            .launchJob(jobParameters);

成功:

2016-05-09 17:34:47.387  INFO 16748 --- [           main] o.s.b.c.l.support.SimpleJobLauncher      : Job: [FlowJob: [name=createFiles]] launched with the following parameters: [{runId=Step01}]
2016-05-09 17:34:47.450  INFO 16748 --- [           main] o.s.batch.core.job.SimpleStepHandler     : Executing step: [deleteProcessedRecords]
2016-05-09 17:34:47.699  INFO 16748 --- [           main] o.s.batch.core.job.SimpleStepHandler     : Executing step: [retrieveIdentifiers]

我已经查看了文档 for Unit Testing,它似乎表明我应该能够传入步骤名称。谁能告诉我如何正确测试步骤,或者我是否做错了什么?提前致谢,

塞尔吉奥。

编辑:

按照要求,步骤如下:

@Autowired
private DeleteProcessedRecordsTasklet deleteProcessedRecordsTasklet;

@Bean
public Step deleteProcessedRecords() {
    return stepBuilderFactory.get("deleteProcessedRecords")
            .tasklet(deleteProcessedRecordsTasklet)
            .build();
}

我正在使用 spring-batch-core 版本 3.0.7.RELEASE,spring-boot-starter-batch 1.3 的一部分。5.RELEASE

对不起,我会发表评论而不是回答,但我没有足够的声誉。但根据您的 Spring 批处理版本,您可能会受到此 bug.

的影响

今天遇到了和你一样的问题,希望对你有所帮助。

我的问题是在我尝试启动该步骤时流程尚未初始化,因此找不到该步骤:

java.lang.IllegalStateException: No Step found with name: [firstStep]

为了解决我的问题,我只是用 @Bean 注释标记了 return 我的流程的功能,这样流程在我尝试使用 JobLauncherTestUtils 启动步骤之前被初始化。

@Bean //***this solved my problem***
public Flow initialFlow() {
    return new FlowBuilder<Flow>("initialFlow")
    .start(firstStep)
    .next(secondStep)
    .end();
}

现在我可以运行这样的步骤了:

jobLauncherTestUtils.setJob(exampleJob);
JobExecution jobExecution = jobLauncherTestUtils.launchStep("firstStep");

我通过在函数 findSteps 内的 this file 上放置一个断点来解决这个问题。我意识到该步骤没有被添加到 getStep 方法(由 JobLauncherTestUtils 中的 launchStep 使用)使用的步骤图中。

我的问题与 bug 2291 无关,我怀疑你的也不是。如果您使用的是 3.0.7.RELEASE 您已经有了修复代码。