Testing @Scheduled in spring

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)));

}

回答:

你可以使用常规的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 : 2019/11/06 11:41:58 Friday

Next Execution date: 2019/11/09 01:00:00 Monday

由于最后一次执行(在中设置TriggerContext)是星期五,因此下一次执行将在下一个星期一。

我对Spring api有所了解,并且找到了这个解决方案,希望它对我有所帮助。

以上是 Testing @Scheduled in spring 的全部内容, 来源链接: utcz.com/qa/425103.html

回到顶部