如何测试春季@Scheduled
2022-09-01 03:04:28
如何在 Spring-boot 应用程序中测试@Scheduled
作业任务?
package com.myco.tasks;
public class MyTask {
@Scheduled(fixedRate=1000)
public void work() {
// task execution logic
}
}
如何在 Spring-boot 应用程序中测试@Scheduled
作业任务?
package com.myco.tasks;
public class MyTask {
@Scheduled(fixedRate=1000)
public void work() {
// task execution logic
}
}
如果我们假设您的作业以如此小的时间间隔运行,以至于您确实希望测试等待作业执行,并且您只想测试是否调用了作业,则可以使用以下解决方案:
将 Awaitility 添加到类路径:
<dependency>
<groupId>org.awaitility</groupId>
<artifactId>awaitility</artifactId>
<version>3.1.0</version>
<scope>test</scope>
</dependency>
编写类似于以下内容的测试:
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
@SpyBean
private MyTask myTask;
@Test
public void jobRuns() {
await().atMost(Duration.FIVE_SECONDS)
.untilAsserted(() -> verify(myTask, times(1)).work());
}
}
我的问题是:“你想测试什么?
如果你的答案是“我想知道Spring在我想要的时候运行我的计划任务”,那么你是在测试Spring,而不是你的代码。这不是您需要进行单元测试的东西。
如果你的回答是“我想知道我是否正确配置了我的任务”,则编写一个包含频繁运行的任务的测试应用,并验证该任务是否在你期望运行时运行。这不是一个单元测试,但将表明您知道如何正确配置任务。
如果答案是“我想知道我编写的任务是否正确函数”,那么您需要对任务方法进行单元测试。在您的示例中,您希望对该方法进行单元测试。为此,请编写一个直接调用任务方法的单元测试 ()。例如work()
work()
public class TestMyTask
{
@InjectMocks
private MyTask classToTest;
// Declare any mocks you need.
@Mock
private Blammy mockBlammy;
@Before
public void preTestSetup()
{
MockitoAnnotations.initMocks(this);
... any other setup you need.
}
@Test
public void work_success()
{
... setup for the test.
classToTest.work();
.. asserts to verify that the work method functioned correctly.
}