我在一个Spring Boot应用程序中有一个预定的任务:
@Scheduled(fixedRateString = "${scheduled.task.rate}")
public void runScheduledTask() {
// ...
}
并进行相应的测试:
@Test
public void test_scheduledTask_runs() {
await().atMost(Duration.ofMillis(scheduledTaskRate).multipliedBy(2)).untilAsserted(() -> {
Mockito.verify(scheduledTasks, Mockito.atLeastOnce()).runScheduledTask();
});
}
现在我想使用cron,而不是固定的汇率:
@Scheduled(cron = "${scheduled.task.cron}")
现在我需要调整测试以适应这一点。如何获得与cron表达式的频率相对应的Duration
对象?
1条答案
按热度按时间h43kikqp1#
Spring 解决方案:
Spring提供了一个
CronExpression
类,可用于解析cron表达式并获得下一个Temporal
示例,在该示例上,它将在所提供的Temporal
之后被触发。因此,要获得
Duration
:请注意,
Instant
在这里不能用作Temporal
,因为它不能表示cron表达式的所有组件,例如Day of Week
,给出了以下例外:Spring版本低于5.3的原始答案
Spring提供了一个
CronSequenceGenerator
,可用于解析cron表达式并获得下一个Date
示例,在该示例上,它将在提供的Date
之后被触发。因此,要获得
Duration
: