2009-06-29 91 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次执行。