假设我具有类似于

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

什么是测试这个bean确实会触发在其指定的日期的最佳方式,的的上周日最接近每月15日上午6点?


<强>更新:这被认为是一个单元测试,所以我不会火起来VM或更改系统时间

有帮助吗?

解决方案

那么首先,有一个在测试CronTriggerBean本身是没有意义的。这是弹簧框架的一部分,并且已经进行了测试。

有一个更好的测试可能是测试你的cron表达式是你所期望的。这里的一个选择是使用Quartz的CronExpression类。给定一个CronExpression对象,你可以调用getNextValidTimeAfter(Date),其下一次当表达式将触发指定日期之后返回。

其他提示

我用CronMaker只以确保如果我的cron表达式是公形成,检查出来: http://www.cronmaker.com/

  1. 您总是可以等到7月的15小时。
  2. 会被更严重......如果它真的该应用程序的重要组成部分,我需要有它的全面测试。我会建议使用一些虚拟化设置,并有一些来宾机器内安装的应用程序。然后,你可以与系统时钟发挥并没有整整一个月在花费测试不同的日期/时间。而且没有什么应该从阻止你的自动化这样的测试。

对于那些谁不使用Quartz调度,而是直接使用TaskSchedular

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

您还可以得到从弹簧触发豆并调用getFireTimeAfter方法来完成。

我发现了一个凉爽文档这里有关测试CronExpression http://www.nurkiewicz.com/2012/10/testing石英-时钟守护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();

由于这立即执行,然后每×时间。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top