2009-06-29 18 views
13

Suponiendo que tengo una CronTriggerBean similar aPruebas de cuarzo CronTrigger gatillo

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

¿Cuál es la mejor manera de probar que este frijol realidad activará en su fecha especificada, es decir en el día de la semana más cercano al 15 de cada mes a las 6 AM?


actualización: Esto se supone que es una prueba de la unidad, así que no voy a encender una máquina virtual o cambiar la hora del sistema.

Respuesta

17

Bueno, en primer lugar, no tiene sentido probar CronTriggerBean sí mismo. Es parte del marco de primavera, y ya ha sido probado.

Una prueba podría ser mejor para probar que su expresión cron es lo que espera. Una opción aquí es usar la clase CronExpression de Quartz. Dado un objeto CronExpression, puede llamar getNextValidTimeAfter(Date), que devuelve la próxima vez después de la fecha dada cuando la expresión se disparará.

+0

Solo para aclarar: no estoy sugiriendo que cambie su código para usar CronExpression, pero que su prueba unitaria debería usarlo. – skaffman

+0

Interesante, lo echaré un vistazo. –

3
  1. Siempre puede esperar hasta el 15 de julio.
  2. ser más serio ... Si realmente es una parte clave de la aplicación y que es necesario tener que probó plenamente. Yo recomendaría el uso de algunos virtualización configuraciones y tienen la aplicación instalada dentro de algún equipo invitado. Luego, podría jugar con el reloj del sistema y probar diferentes fechas/horas sin tener que pasar un mes entero en él. Además, no hay nada que deba evitar que automatice tales pruebas.
+0

Gracias por la respuesta. Se supone que esto es una prueba unitaria, así que no voy a encender una VM o cambiar la hora del sistema. –

1

También puede obtener el grano de disparo desde la primavera e invocar el método getFireTimeAfter para terminar.

2

Para aquellos que no utilizan el programador de cuarzo, pero en lugar de utilizar el TaskSchedular directamente:

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

encontré una documentación fresco aquí sobre cómo probar la CronExpression: # aplicación http://www.nurkiewicz.com/2012/10/testing-quartz-cron-expressions.html

el C será algo así como esto:

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; 
} 

Esta es una demostración genial. Pero al final, termino usando Simple Schedule.

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

Porque esto se ejecuta inmediatamente y luego cada x vez.