如果作业正在使用simpleAsyncTaskExecutor运行,如何在Spring Batch中编写测试用例

时间:2019-06-03 05:59:19

标签: java spring-boot spring-batch

我有使用SimpleAsyncTaskExecutor运行的spring批处理作业。我必须为Job实施一个测试用例。但是Afterjob在测试完成后仍然执行。

在我的测试用例中,我有一个无限循环,在该循环中我正在检查Job执行是否正在运行。完成后,我正在检查断言。

@Test
public void testPostalJob_valid_response() throws Exception {
    String fileName = getFileName(FileLocation.POSTAL_VALID, FileLocation.TEMP_POSTAL_VALID);
    JobParametersBuilder jobParametersBuilder = getJobParametersBuilder(fileName);
    new NonStrictExpectations () {
        {
            mailSender.send((SimpleMailMessage) any);
        }
    };
    jobLauncherTestUtils.setJob(postalJob);
    jobLauncherTestUtils.setJobLauncher(dataloadJobLauncher);
    JobExecution jobExecution = jobLauncherTestUtils.launchJob(jobParametersBuilder.toJobParameters());
    Assert.assertEquals(jobExecution.getStatus(), BatchStatus.STARTING);
    Thread.sleep(2000);
    while (jobExecution.isRunning()) {

    }
    Assert.assertEquals(jobExecution.getStatus(), BatchStatus.COMPLETED);
}

我想测试作业是否成功完成或失败,但是我希望在运行主应用程序后进行测试。现在我正在使用while循环,但是我想对异步代码使用更简洁的方法。请帮我一样。

1 个答案:

答案 0 :(得分:0)

我得到的最佳解决方案是在同步模式下运行异步作业,因为这里的主要思想是测试作业是否成功运行。

在应用程序中,如果JobLauncher名称不是jobLauncher,则您无需执行其他任何操作,则必须创建jobLauncher并将其设置为jobLauncherTestUtils。

@Autowired
private JobLauncherTestUtils jobLauncherTestUtils;

@Autowired
private Job postalJob;

@Autowired
private MailServiceImpl mailService;


@BeforeClass
public void setJob() {
    jobLauncherTestUtils.setJob(postalJob);
    mailService.setMailSender(new JavaMailSenderTestImpl());
}

@Test
public void testPostalJob_valid_response() throws Exception {
    String fileName =
            TestUtil.getFileName(FileLocation.POSTAL_VALID, FileLocation.TEMP_POSTAL_VALID);
    JobParametersBuilder jobParametersBuilder = TestUtil.getJobParametersBuilder(fileName);
    JobExecution jobExecution =
            jobLauncherTestUtils.launchJob(jobParametersBuilder.toJobParameters());
    Assert.assertEquals(jobExecution.getStatus(), BatchStatus.COMPLETED);
}