Dav*_*vid 49 java spring unit-testing scheduler
Spring提供了使用注释以特定间隔安排和执行任务的可能性,例如 @Scheduled
有没有方便的单元测试这种行为的方法?
当然我可以自己调用bean的方法,但是我想确保不会因为配置错误等问题而遇到多次执行等问题.
其他框架提供了自己快速转发时间的可能性.一个例子是Activiti,你可以打电话
org.activiti.engine.impl.util.ClockUtil.setCurrentTime(date)
快进框架使用的时间.
春天有类似的东西吗?
基本上我想要做的是在单元测试中使用这样的东西(运行使用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)));
}
小智 38
您可以使用常规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)是星期五,下一次执行将在下一个星期一执行.
我正在摆弄Spring api,我发现了这个解决方案,我希望这对帮助我的人有所帮助.
Juk*_*kka -1
通过直接调用 bean 来测试预定的代码。
然后通过以下方式测试调度配置:
1)在测试环境中部署代码,让它运行一段时间并检查日志和/或结果(假设计划的代码执行一些日志记录和/或产生可见的结果)。
或者
2) 使用命名空间外部化 Spring XML 配置中的<task: />调度配置,并使用PropertyPlaceHolderConfigurer. 然后在您的测试中验证计划的代码(无论是模拟的还是真实的)在给定(短)时间内被调用了正确的次数。