Подтвердить что ты не робот

Тестирование @Планируется в 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)));
}
4b9b3361

Ответ 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. Затем в вашем тесте убедитесь, что запланированный код (будь то издевательство или реальная вещь) вызывал правильное количество раз в заданное (короткое) время.