当前位置: 首页 > 知识库问答 >
问题:

使用cron属性测试Spring-boot中的@scheduled函数

周涵畅
2023-03-14

我想测试我的cron作业是否会在给定的时间(每年1月1日00:00)执行。有办法测试一下吗?不幸的是,我在网上找到的每一个例子都指的是将在一个固定周期之后执行的作业,例如全部5秒。(https://www.baeldung.com/spring-testing-schedule-annotation)。

    @Scheduled(cron = " 0 0 1 1 *")
    public void myFunc() {
         do something
    }

共有1个答案

吴英武
2023-03-14

那么,如果您真的想测试执行,您将不得不在新年前夕监视应用程序;<)

如果您想测试调度是否已正确设置,并且您的任务是否已排定,那么您可以自动调用ScheduledStaskHolder并为您的任务查询该ScheduledStaskHolder。假设此实现:

package nl.benooms.scheduledannotationplayground;
@Service
public class FixedDateSchedule {
    @Scheduled(cron = "0 0 0 1 1 *")
    public void OnceAYearCron() {
        System.out.println("yearly");
    }
}

那么测试可以是:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
class FixedDateScheduleTest {

    @Autowired
    private ScheduledTaskHolder scheduledTaskHolder;

    @Test
    public void testYearlyCronTaskScheduled() {
        Set<ScheduledTask> scheduledTasks = scheduledTaskHolder.getScheduledTasks();
        scheduledTasks.forEach(scheduledTask -> scheduledTask.getTask().getRunnable().getClass().getDeclaredMethods());
        long count = scheduledTasks.stream()
                .filter(scheduledTask -> scheduledTask.getTask() instanceof CronTask)
                .map(scheduledTask -> (CronTask) scheduledTask.getTask())
                .filter(cronTask -> cronTask.getExpression().equals("0 0 0 1 1 *") && cronTask.toString().equals("nl.benooms.scheduledannotationplayground.FixedDateSchedule.OnceAYearCron"))
                .count();
        assertThat(count).isEqualTo(1L);
    }
}
  • 未设置@scheduled或@enableScheduling
  • cron表达式不准确
  • 类名和方法名不对应请注意,如果不是示例,我会将测试格式设置为更易读的格式
 类似资料:
  • 我的测试属性将被放置在生产属性中的属性覆盖。当时,我两人都给起了名字,但它不起作用,所以我就像这篇文章中说的那样,改成了并使用profile。现在看起来就像贝娄(kotlin): 在中,我只将此属性设置为,而在中,则设置为。 这个测试失败了。完整示例可在github上找到 Thx提前。

  • 我想在我的角度表上指定的日期和时间执行以下方法-以下是输入: 发送电子邮件的方法(来自控制器) 电子邮件otification.class 我不知道该怎么做,如果有人帮忙,我会很感激的

  • 在我们的系统中,我们使用一个设置类来指向属性文件,这取决于它加载不同属性文件的eve。要访问特定属性,我们调用“设置”。getString('property_name_here')。 在我的代码中,我将@scheduled cron表达式加载到一个变量,并尝试将其传递给@scheduled注释,但它不起作用, 下面是我的代码:在属性文件中: 在我看来: 它创建了一个字符串“0114***”,这是

  • 只是想知道如果你想让它在晚上21点到早上6点之间每隔三分钟运行一次,这是一个正确的@Sched约cron表达式吗: 会持续一整晚吗?

  • 考虑以下示例: 我正在使用注释的属性为这个测试套件中的所有测试设置属性的值。现在,我想为其中一个测试(例如)设置该属性的另一个值,而不影响其他测试。我怎样才能做到这一点?我已经阅读了Spring Boot docs中的“测试”一章,但是我还没有找到任何与我的用例匹配的东西。

  • 我在任何地方都没见过这样的问题,所以我要在这里问一下。我必须为一个对象类型创建几个实例,我必须实例的数量应该从文件中提供。properties。我尝试使用注释@value,但它总是给我 NullPointerException 所以我不能解析它,因为它是空值。如何正确获取instances.number值? ...