example - table swing java
Pruebas @Programadas en primavera (2)
Pruebe el código programado invocando el bean directamente.
Luego prueba la configuración de programación por:
1) desplegar su código en un entorno de prueba, dejándolo funcionar por un tiempo e inspeccionando registros y / o resultados (suponiendo que el código programado logre algo y / o produzca resultados visibles) después.
o
2) externalizar la configuración de programación en Spring XML config usando el espacio de nombres <task: />
e inyectar un intervalo / programa específico para la prueba unitaria (preferiblemente corto y frecuente para usar en una prueba de unidad / integración) usando PropertyPlaceHolderConfigurer
. Luego, en su prueba, verifique que el código programado (ya sea burlado o real) haya sido invocado la cantidad adecuada de veces en la cantidad dada (corta) de tiempo.
Spring ofrece la posibilidad de programar y ejecutar tareas a intervalos específicos utilizando anotaciones, por ejemplo, @Scheduled
¿Hay alguna forma conveniente de probar esta conducta de manera unitaria?
Por supuesto, podría llamar yo mismo al método del bean, pero quiero asegurarme de no tener problemas como múltiples ejecuciones debido a una mala configuración, etc.
Otros marcos ofrecen la posibilidad de acelerar el tiempo usted mismo. Un ejemplo es Activiti donde puedes llamar
org.activiti.engine.impl.util.ClockUtil.setCurrentTime(date)
para adelantar el tiempo utilizado por el marco.
¿Hay algo comparable en Spring?
Esencialmente, lo que quiero hacer es algo como esto en una prueba unitaria (ejecutar usando SpringJUnit4ClassRunner
)
@Test public void testTaskScheduling() {
assertThat(someOtherBean.getSomeProperty(), is(equalTo(whatIinitiallyExpect)));
SpringClockUtil.setDate(dateInTwoHours)// This is what I am missing
SpringTaskExecutor.executeAllScheduledTasks() // Also missing
assertThat(someOtherBean.getSomeProperty(), is(equalTo(whatIexpectNow)));
}
Puede probar la ejecución del método real utilizando el JUnit regular, pero para probar si el @Scheduled(cron = "0 * * * * *")
que ha especificado es correcto, puede usar:
@Test
public void testScheduler(){
// to test if a cron expression runs only from Monday to Friday
org.springframework.scheduling.support.CronTrigger trigger =
new CronTrigger("0 0 1 * * MON-FRI");
Calendar today = Calendar.getInstance();
today.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss EEEE");
final Date yesterday = today.getTime();
log.info("Yesterday was : " + df.format(yesterday));
Date nextExecutionTime = trigger.nextExecutionTime(
new TriggerContext() {
@Override
public Date lastScheduledExecutionTime() {
return yesterday;
}
@Override
public Date lastActualExecutionTime() {
return yesterday;
}
@Override
public Date lastCompletionTime() {
return yesterday;
}
});
String message = "Next Execution date: " + df.format(nextExecutionTime);
log.info(message);
}
Aquí está el resultado:
Yesterday was : 2015/11/06 11:41:58 Friday
Next Execution date: 2015/11/09 01:00:00 Monday
Como la última ejecución (configurada en TriggerContext
) fue un viernes, la siguiente ejecución será el lunes siguiente.
Estuve jugando con la aplicación de Spring y encontré esta solución, espero que esto ayude a alguien, ya que me ayudó.