Протестируйте функцию @Scheduled в Spring-boot со свойством cron

Я хотел бы проверить, будет ли мое задание Cron выполняться в указанное время (1 января 00:00 каждого года). Есть ли способ это проверить? К сожалению, каждый пример, который я смог найти в Интернете, относится к заданиям, которые будут выполнены после периода исправления, например. все 5 секунд (https://www.baeldung.com/spring-testing-scheduled-annotation).

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

person hansi wasd    schedule 17.11.2020    source источник


Ответы (1)


Что ж, если вы действительно хотите протестировать выполнение, вам придется потратить канун нового года на мониторинг приложения; ‹)

Если вы хотите проверить, правильно ли настроено расписание и что ваша задача запланирована, вы можете автоматически подключить 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 неточно
  • имя класса и метода не соответствуют Обратите внимание, что я бы отформатировал тест в более читаемом формате, если бы не образец
person Ben Ooms    schedule 19.11.2020