如何测试FlowJob中的步骤

时间:2016-05-09 21:54:33

标签: spring junit spring-batch spring-java-config

我试图测试一个包含在一个Job中的一个步骤。这是基本的工作配置:

    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]

但是,如果我测试作业,那么步骤显然就在那里:

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

的一部分

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我今天和你有同样的问题,我希望这可以帮助你。

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

  

java.lang.IllegalStateException:找不到名称的步骤:[firstStep]

要解决我的问题,我只需用@Bean注释标记返回我的Flow的函数,这样在我尝试使用JobLauncherTestUtils启动步骤之前初始化Flow。

@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方法(由launchStep JobLauncherTestUtils使用)的步骤地图中。

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