Test @ Planifié au spring

Spring offre la possibilité de planifier et d’exécuter des tâches à des intervalles spécifiques en utilisant des annotations, par exemple @Scheduled

Existe-t-il un moyen pratique de tester ce comportement à l’unité?

Bien sûr, je pourrais appeler la méthode du haricot moi-même, mais je veux m’assurer que je ne rencontre pas de problèmes tels que des exécutions multiples dues à une mauvaise configuration , etc.

D’autres frameworks offrent la possibilité d’avancer vous-même rapidement dans le temps. Un exemple est Activiti où vous pouvez appeler

 org.activiti.engine.impl.util.ClockUtil.setCurrentTime(date) 

pour avancer rapidement le temps utilisé par le framework.

Y a-t-il quelque chose de comparable au spring?

Essentiellement, ce que je veux faire, c’est quelque chose comme ça dans un test unitaire (exécuter avec 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))); } 

Vous pouvez tester l’exécution de la méthode à l’aide du JUnit standard, mais pour tester si le @Scheduled(cron = "0 * * * * *") vous avez spécifié est correct, vous pouvez utiliser:

 @Test public void testScheduler(){ // to test if a cron expression runs only from Monday to Friday org.springframework.scheduling.support.CronTrigger sortinggger = 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 = sortinggger.nextExecutionTime( new TriggerContext() { @Override public Date lastScheduledExecutionTime() { return yesterday; } @Override public Date lastActualExecutionTime() { return yesterday; } @Override public Date lastCompletionTime() { return yesterday; } }); Ssortingng message = "Next Execution date: " + df.format(nextExecutionTime); log.info(message); } 

Voici la sortie:

 Yesterday was : 2015/11/06 11:41:58 Friday Next Execution date: 2015/11/09 01:00:00 Monday 

Comme la dernière exécution (définie dans TriggerContext ) était un vendredi, la prochaine exécution aura lieu le lundi suivant.

J’étais en train de sortingpoter l’API Spring et j’ai trouvé cette solution, j’espère que cela aidera quelqu’un comme ça m’a aidé.

Testez le code planifié en appelant directement le bean.

Ensuite, testez la configuration de la planification en:

1) déployer votre code dans un environnement de test, en le laissant fonctionner pendant un certain temps et en inspectant les journaux et / ou les résultats (en supposant que le code planifié effectue une journalisation et / ou produit des résultats visibles).

ou

2) externaliser la configuration de planification dans la configuration Spring XML en utilisant l’espace de noms et en injectant un intervalle / un calendrier spécifique au test unitaire (de préférence court et utilisable dans un test unitaire / d’intégration) en utilisant PropertyPlaceHolderConfigurer . Ensuite, dans votre test, vérifiez que le code planifié (que ce soit simulé ou réel) a été invoqué le bon nombre de fois dans le temps imparti.