2009-06-29 92 views
13

假設我有一個CronTriggerBean類似測試石英CronTrigger觸發

<bean id="midMonthCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> 
    <property name="jobDetail" ref="reminderJobDetail" /> 
    <property name="cronExpression" value="0 0 6 15W * ?" /> 
</bean> 

什麼是測試的最佳途徑,這豆實際上將在其指定的日期觸發,在平日最接近15日每個月在上午6點?


更新:這應該是一個單元測試,所以我不打算啓動一個虛擬機或更改系統時間。

回答

17

首先,測試CronTriggerBean本身沒有意義。它是春季框架的一部分,並且已經過測試。

更好的測試可能是測試您的cron表達式是否符合您的期望。這裏的一個選擇是使用Quartz的CronExpression類。給定一個CronExpression對象,您可以調用getNextValidTimeAfter(Date),該表達式將在指定日期後的下一次返回時觸發。

+0

只是澄清 - 我不建議你改變你的代碼使用CronExpression,但你的單元測試應該使用它。 – skaffman 2009-06-29 21:54:23

3
  1. 您可以一直等到7月15日。
  2. 更嚴重...如果它真的是應用程序的關鍵部分,我需要讓它完全測試。我會建議使用一些虛擬化設置,並將該應用程序安裝在某個訪客機器中。然後,您可以使用系統時鐘並測試不同的日期/時間,而無需花費整整一個月的時間。此外,沒有什麼能夠阻止你從自動化這樣的測試。
+0

感謝您的回答。這應該是一個單元測試,所以我不打算啓動虛擬機或更改系統時間。 – 2009-06-29 21:44:22

1

您也可以從spring獲取觸發器bean並調用getFireTimeAfter方法來完成。

2

對於那些誰不使用Quartz調度,而是在TaskSchedular直接使用:

CronSequenceGenerator generator = new CronSequenceGenerator("0 0 8 */1 * *"); 
Date next = generator.next(prev); 
0

我發現了一個很酷的文檔,這裏有關測試CronExpressionhttp://www.nurkiewicz.com/2012/10/testing-quartz-cron-expressions.html

C#的實施,將是這樣的這個:

void Run() 
{ 
    //var collection = findTriggerTimesRecursive(new CronExpression("0 0 17 L-3W 6-9 ? *"), DateTime.UtcNow); 
    var collection = findTriggerTimesRecursive(new CronExpression("0 0/15 * 1/1 * ? *"), DateTime.UtcNow); 
    Console.WriteLine(DateTime.UtcNow); 
    foreach (var item in collection) 
    { 
     Console.WriteLine(item); 
    } 
} 

public List<DateTimeOffset> findTriggerTimesRecursive(CronExpression expr, DateTimeOffset from, int max = 10) 
{ 
    var times = new List<DateTimeOffset>(); 
    var next = expr.GetNextValidTimeAfter(from); 

    while (next != null && times.Count < max) 
    { 
     times.Add(next.Value); 
     from = next.Value; 
     next = expr.GetNextValidTimeAfter(from); 
    } 

    return times; 
} 

這是一個很酷的演示。但最後,我結束使用簡單的時間表。

var trigger = TriggerBuilder.Create() 
    .WithIdentity("trigger3", "group1") 
    .WithSimpleSchedule(
     x => 
     { 
      x.WithIntervalInMinutes(15); 
      x.RepeatForever(); 
     } 
    ) 
    .ForJob("myJob", "group1") 
    .Build(); 

因爲這是立即執行,然後每x次執行。