如何测试 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 您已经有了修复代码。
我正在尝试测试包含在作业中的流程中的步骤。这是基本的作业配置:
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 您已经有了修复代码。