Тестирование @Планируется в spring
Spring предлагает возможность планировать и выполнять задачи с определенными интервалами с помощью аннотаций, например. @Scheduled
Есть ли удобный способ для unit test этого поведения?
Конечно, я мог бы сам вызвать метод bean, но хочу, чтобы у меня не возникало проблем, таких как несколько исполнений из-за неправильной настройки и т.д.
Другие фреймворки предлагают возможность быстро переправить время самостоятельно. Одним из примеров является Activiti, где вы можете позвонить
org.activiti.engine.impl.util.ClockUtil.setCurrentTime(date)
чтобы ускорить время, используемое каркасом.
Есть ли что-то сопоставимое в Spring?
По сути, я хочу сделать что-то вроде этого в unit test (запустите с помощью SpringJUnit4ClassRunner
)
@Test public void testTaskScheduling() {
assertThat(someOtherBean.getSomeProperty(), is(equalTo(whatIinitiallyExpect)));
SpringClockUtil.setDate(dateInTwoHours)// This is what I am missing
SpringTaskExecutor.executeAllScheduledTasks() // Also missing
assertThat(someOtherBean.getSomeProperty(), is(equalTo(whatIexpectNow)));
}
Ответы
Ответ 1
Вы можете проверить фактическое выполнение метода с помощью обычного JUnit, но для проверки правильности указанного @Scheduled(cron = "0 * * * * *")
вы можете использовать:
@Test
public void testScheduler(){
// to test if a cron expression runs only from Monday to Friday
org.springframework.scheduling.support.CronTrigger trigger =
new CronTrigger("0 0 1 * * MON-FRI");
Calendar today = Calendar.getInstance();
today.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss EEEE");
final Date yesterday = today.getTime();
log.info("Yesterday was : " + df.format(yesterday));
Date nextExecutionTime = trigger.nextExecutionTime(
new TriggerContext() {
@Override
public Date lastScheduledExecutionTime() {
return yesterday;
}
@Override
public Date lastActualExecutionTime() {
return yesterday;
}
@Override
public Date lastCompletionTime() {
return yesterday;
}
});
String message = "Next Execution date: " + df.format(nextExecutionTime);
log.info(message);
}
Вот результат:
Yesterday was : 2015/11/06 11:41:58 Friday
Next Execution date: 2015/11/09 01:00:00 Monday
Поскольку последнее выполнение (установленное в TriggerContext
) было пятницей, следующее выполнение будет в следующий понедельник.
Я играл с api Spring, и я нашел это решение, я надеюсь, что это помогает кому-то, поскольку это помогло мне.
Ответ 2
Проверьте запланированный код, вызвав непосредственно bean.
Затем проверьте конфигурацию планирования:
1) развертывание вашего кода в тестовой среде, позволяя ему работать некоторое время и проверять журналы и/или результаты (при условии, что запланированный код выполняет некоторое ведение журнала и/или дает видимые результаты).
или
2) экстернализация конфигурации планирования в конфигурации Spring XML с использованием пространства имен <task: />
и впрыскивание unit test -специфического интервала/расписания (желательно короткие и часто используемые для использования в тесте unit/integration) с использованием PropertyPlaceHolderConfigurer
. Затем в вашем тесте убедитесь, что запланированный код (будь то издевательство или реальная вещь) вызывал правильное количество раз в заданное (короткое) время.