如何测试春季@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
     }
 }

答案 1

如果我们假设您的作业以如此小的时间间隔运行,以至于您确实希望测试等待作业执行,并且您只想测试是否调用了作业,则可以使用以下解决方案:

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());
    }
}

答案 2

我的问题是:“你想测试什么?

如果你的答案是“我想知道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.
  }

推荐