如何使用@SpringBootTest 验证作业是不是运行了另一个作业

Posted

技术标签:

【中文标题】如何使用@SpringBootTest 验证作业是不是运行了另一个作业【英文标题】: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 中运行下一个作业是可行的方法,但我可能会遗漏一些东西。 好的,我会添加一个答案。 【参考方案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,仍然很难从侦听器访问它并对其进行断言。我的经验法则:如果很难测试,则可能是设计不佳(您说您没有编写该代码,很高兴知道您正在更改该代码)。

以上是关于如何使用@SpringBootTest 验证作业是不是运行了另一个作业的主要内容,如果未能解决你的问题,请参考以下文章

使用@SpringBootTest时如何在测试类中自动装配bean

如何模拟@springboottest 的应用程序配置或上下文?

Kotlin - 如何在 springBootTest 中管理 @BeforeClass 静态方法

如何验证使用 FTP 提交到 z/OS 的作业是不是已完成?

使用 SpringBootTest 时如何在控制器中使用 span 初始化默认跟踪上下文

一分钟上手SpringBootTest