2013-06-26 12 views
30

Springは、アノテーションを使用して特定の間隔でタスクをスケジュールし実行する可能性を提供します。 @Scheduled春にスケジュールされた@

この動作を単体テストする便利な方法はありますか?

もちろん私は豆のメソッドを自分で呼び出すことができますが、私はmultiple executions due to misconfigurationのような問題に遭遇しないようにしたいと思います。

他のフレームワークでは、自分自身で早送りすることができます。 1つの例はActivitiであり、フレームワークで使用された時間を早送りするには

org.activiti.engine.impl.util.ClockUtil.setCurrentTime(date) 

とすることができます。

Springに匹敵するものはありますか?

は基本的に私は何をしたい、直接Beanを呼び出すことにより、ユニットテストでは、このような何か(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

テスト予定のコードです。

その後でスケジュール設定をテスト:

1)、テスト環境でコードを展開し、それはしばらくの間、実行させると、ログおよび/または結果を検査するには、(スケジュールされたコードは、いくつかのロギングを行い、および/または生産すると仮定すると目に見える結果)。

又は

2)PropertyPlaceHolderConfigurerを使用して(好ましくは短い、頻繁ユニット/統合テストに使用できるように)<task: />名前空間を使用し、ユニットテスト特定の間隔/スケジュールを注入スプリング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に設定されています)は金曜日でした。次の実行は次の月曜日に行われます。

私は春のAPIを使いこなしていましたが、私はこの解決策を見つけました。

関連する問題