14

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 を起動したり、システム時刻を変更したりするつもりはありません。

4

6 に答える 6

19

まず、それ自体をテストしても意味がありませんCronTriggerBean。これは、Spring フレームワークの一部であり、既にテストされています。

より良いテストは、cron 式が期待どおりであることをテストすることです。ここでの 1 つのオプションは、Quartz のCronExpressionクラスを使用することです。オブジェクトを指定すると、 をCronExpression呼び出すことができますgetNextValidTimeAfter(Date)。これは、指定された Date の次に式が実行されるときに返されます。

于 2009-06-29T21:50:03.703 に答える
7

CronMaker は、cron 式が適切に形成されているかどうかを確認するためだけに使用しました。http://www.cronmaker.com/ を確認して ください。

于 2012-03-23T19:32:41.870 に答える
3
  1. 7月15日までいつでもお待ちしております。
  2. もっと深刻なことに...それが本当にアプリケーションの重要な部分であり、私がそれを完全にテストする必要がある場合. いくつかの仮想化セットアップを使用し、アプリケーションをいくつかのゲスト マシンにインストールすることをお勧めします。次に、システム クロックをいじって、1 か月も費やさずにさまざまな日付/時刻をテストできます。さらに、そのようなテストの自動化を妨げるものは何もありません。
于 2009-06-29T21:16:02.120 に答える
1

また、Spring からトリガー Bean を取得し、getFireTimeAfterメソッドを呼び出して終了することもできます。

于 2011-01-17T05:34:52.613 に答える
0

のテストに関するクールなドキュメントを見つけました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();

これはすぐに実行され、その後 x 回ごとに実行されるためです。

于 2016-05-10T21:42:31.753 に答える