我在Spring Boot应用程序中定义了多个Spring Batch Jobs。例如,job1,job2。等
当我为其中一个工作写了一个junit测试。 问题是,当我查看测试输出日志时,我发现它尝试启动此项目中定义的所有作业。
我在项目中使用最新的稳定的Spring Boot 1.2.5,Spring Batch 3.0.4。
junit测试的片段代码如下。
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@TransactionConfiguration
@SpringApplicationConfiguration(classes = BatchApplication.class)
public class SubmitJobTest {
@Inject Job job1;
@Test
public void testLockJob() {
logger.debug("lockId is @" + task.getLockId());
JobParametersBuilder builder = new JobParametersBuilder()
.addString("lockId", lockId.toString());
try {
JobExecution jobExecution = jobLauncher.run(this.job1, builder.toJobParameters());
assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus());
} catch (JobExecutionAlreadyRunningException | JobRestartException | JobInstanceAlreadyCompleteException | JobParametersInvalidException ex) {
ex.printStackTrace();
}
}
我定义的一些作业需要JobParamters才能运行,因此当我运行此测试时,其他作业已经启动并执行,然后由于缺少特定的JobParamters而抛出异常。
我尝试将@Named
添加到Job并使用唯一名称注入,但得到了相同的结果。
我自己解决了这个问题。将spring.batch.job.enabled=false
添加到application.yml
后,就可以了。
答案 0 :(得分:3)
你做不到。几周前我问了同样的问题: Using @SpringApplicationConfiguration: How to set jobparameters in tests when using spring-batch and spring-boot
您必须直接使用JobLauncherCommandLineRunner:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {MyBatchRootConfiguration.class})
@IntegrationTest({"aProp=aValue"})
public class MyBatchTestClass {
@Autowired
private JobLauncherCommandLineRunner runner;
@Test
public void launchTest() {
String[] myArgs = new String[]{"jobParam1=value1"};
runner.run(myArgs);
}
}