【问题标题】:How to verify if a Job ran another Job using @SpringBootTest如何使用@SpringBootTest 验证作业是否运行了另一个作业
【发布时间】:2020-07-28 09:23:12
【问题描述】:

我正在@SpringBootTest 中运行批处理作业:

@Autowired
private JobRunner jobRunner;

jobRunner.runNowForTests("X_Job");

我有一个监听器在X_Job 完成后运行Y_Job

class JobFinishedEventListener  {

    @Autowired
    private JobRunner jobRunner;

    @Override
    public void afterJob(JobExecution jobExecution) {
        jobRunner.runNow("Y_Job");
    }

}

我的@Test 函数正在检查X_Job 是否成功完成,如下所示:

assertJobStatus(X_Job_Execution, COMPLETED);

但是,我不知道如何测试 Y_Job 是否成功运行,因为我没有对其执行的参考。我怎样才能做到这一点?

【问题讨论】:

  • @MahmoudBenHassine 嗯,没错。但我还是想知道要做到这一点,这是我没有写的代码。比如,也许有办法让所有作业都在当前上下文中运行?
  • I have a listener that runs Y_Job after X_Job finishes: 有什么理由这样做而不是依次运行两个作业?我不认为在当前作业的 listener#afterJob 中运行下一个作业是可行的方法,但我可能会遗漏一些东西。
  • 好的,我会添加一个答案。

标签: java spring-boot junit spring-batch


【解决方案1】:

除非我遗漏了什么,否则我不明白为什么要使用当前作业的listener#afterJob 来运行下一个作业。这在功能上应该与以下相同(在作业启动器中使用同步任务执行器):

JobExecution jobExecution1 = jobLauncher.run(job_x, params_x);
JobExecution jobExecution2 = jobLauncher.run(job_y, params_y);

这种方法允许您获取对作业执行的引用并根据需要添加断言。

【讨论】:

  • 哇,我们肯定在改变我们的代码。实际上,我从来没有问过自己是同步还是异步。我刚刚看到编写代码的人正在使用 afterJob,我一直认为它是异步的,但事实并非如此。正如你所说, afterJob 毕竟是没有必要的。谢谢。但是没有选择作为接受的答案,因为我仍然对如何知道 job_y 是否使用当前方法运行感到好奇
  • 我对您当前的方法无能为力,因为您没有分享 jobRunner.runNowjobRunner.runNowForTests 返回的内容(void 类型或 JobExecution)。即使它返回一个 JobExecution,仍然很难从侦听器访问它并对其进行断言。我的经验法则:如果很难测试,则可能是设计不佳(您说您没有编写该代码,很高兴知道您正在更改该代码)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-24
相关资源
最近更新 更多