Spring 提供了使用注释按特定时间间隔安排和执行任务的可能性,例如@Scheduled http://static.springsource.org/spring/docs/3.0.x/reference/scheduling.html
有没有一种方便的方法来单元测试这种行为?
当然,我可以自己调用 bean 的方法,但我想确保我不会遇到类似的问题由于配置错误导致多次执行 https://stackoverflow.com/questions/14242310/java-spring-scheduled-tasks-executing-twice等等。
其他框架提供了您自己快进时间的可能性。一个例子是Activiti http://www.activiti.org/你可以在哪里打电话
org.activiti.engine.impl.util.ClockUtil.setCurrentTime(date)
快进框架使用的时间。
Spring 有类似的东西吗?
本质上我想做的是在单元测试中做类似的事情(使用运行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)));
}
您可以使用常规 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,找到了这个解决方案,我希望这可以帮助别人,就像它帮助我一样。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)