2013-06-26 51 views
30

Spring提供了使用註釋以特定間隔計劃和執行任務的可能性。 @Scheduled測試@春季計劃

有沒有一種方便的方法來單元測試這種行爲?

當然我可以自己調用bean的方法,但是我想確保我不會遇到類似multiple executions due to misconfiguration等問題。

其他框架提供了自己快速轉發時間的可能性。一個例子是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))); 
} 

回答

0

測試計劃的代碼通過直接調用這個bean。

然後測試由調度配置:

1)在測試環境中部署的代碼,讓它運行了一段時間,檢查日誌和/或結果(假定調度的代碼做一些記錄和/或產生事後可見的結果)。

2)使用<task: />命名空間和注入單元特定的測試間隔/時間表(優選短且頻繁被使用PropertyPlaceHolderConfigurer以單位/集成測試可用)外部化的調度配置在Spring XML配置。然後在你的測試中,驗證在給定的(短)時間內調用的預定代碼(不論是嘲弄還是真實的)被調用了適當的次數。

21

您可以使用常規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,我發現這個解決方案,我希望這可以幫助一個人,因爲它幫助了我。