如何使用@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.runNow
和 jobRunner.runNowForTests
返回的内容(void 类型或 JobExecution)。即使它返回一个 JobExecution,仍然很难从侦听器访问它并对其进行断言。我的经验法则:如果很难测试,则可能是设计不佳(您说您没有编写该代码,很高兴知道您正在更改该代码)。以上是关于如何使用@SpringBootTest 验证作业是不是运行了另一个作业的主要内容,如果未能解决你的问题,请参考以下文章
使用@SpringBootTest时如何在测试类中自动装配bean
如何模拟@springboottest 的应用程序配置或上下文?
Kotlin - 如何在 springBootTest 中管理 @BeforeClass 静态方法
如何验证使用 FTP 提交到 z/OS 的作业是不是已完成?