Тестирование Кварцевого триггера CronTrigger

Предполагая, что у меня естьCronTriggerBean похожий на

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

Каков наилучший способ проверить, что этот бин на самом деле сработает в указанную дату,i.e. в будний день, ближайший к 15 числа каждого месяца в 6 часов утра?

UpdateПредполагается, что это будет модульное тестирование, поэтому я не собираюсь запускать виртуальную машину или изменять системное время.

Ответы на вопрос(6)

Я нашел здесь классную документацию о тестированииCronExpression: http://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();

Потому что это выполняется немедленно, а затем каждый раз.

getFireTimeAfter способ закончить.

Решение Вопроса

CronTriggerBean сам. Он является частью каркаса пружины и уже испытан.

Лучшим тестом может быть проверка того, что ваше выражение cron соответствует вашим ожиданиям. Одним из вариантов здесь является использование кварцаCronExpression учебный класс. УчитываяCronExpression объект, вы можете позвонитьgetNextValidTimeAfter(Date), который возвращает следующий раз после заданной даты, когда выражение сработает.

 Robert Munteanu30 июн. 2009 г., 12:49
Интересно, я взгляну на это.
 29 июн. 2009 г., 23:54
Просто чтобы уточнить - я не предлагаю вам изменить свой код для использования CronExpression, а для того, чтобы его использовал ваш модульный тест.
You can always wait until the 15h of July. Being more serious... If it's really a key part of the application and I you need to have it tested fully. I would recommend using some virtualization setups and have the application installed within some guest machine. Then you could play with the system clock and test different date/times without spending a whole month on it. Moreover there's nothing that should stop you from automating such tests.
 Robert Munteanu29 июн. 2009 г., 23:44
Спасибо за ответ. Предполагается, что это будет модульное тестирование, поэтому я не собираюсь запускать виртуальную машину или изменять системное время.

кто не использует планировщик Quartz, а вместо этого используетTaskSchedular непосредственно:

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

чтобы убедиться, что мое выражение cron правильно сформировано, проверьте его: http://www.cronmaker.com/

Ваш ответ на вопрос