2013-06-26 15 views
30

Spring offre la possibilità di pianificare ed eseguire attività a intervalli specifici utilizzando annotazioni, ad es. @ScheduledTest @ programmato in primavera

C'è un modo conveniente per testare questo comportamento?

Ovviamente potrei chiamare il metodo del bean da solo, ma voglio essere sicuro di non incorrere in problemi come multiple executions due to misconfiguration e così via.

Altre strutture offrono la possibilità di far avanzare rapidamente il tempo da soli. Un esempio è Activiti dove è possibile chiamare

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

per far avanzare rapidamente il tempo utilizzato dal framework.

C'è qualcosa di simile in primavera?

Essenzialmente quello che voglio fare è qualcosa di simile a una prova di unità (di esecuzione utilizzando 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))); 
} 

risposta

0

testare il codice in programma invocando direttamente il fagiolo.

Poi verificare la configurazione di programmazione da:

1) la distribuzione il codice in un ambiente di test, lasciando funzionare per un po 'e ispezionare i registri e/o risultati (supponendo che il codice di programma fa qualche registrazione e/o produce risultati visibili) in seguito.

o

2) esternalizzazione configurazione schedulazione in config Spring XML utilizzando lo spazio <task: /> e iniettando una specifica unità test intervallo/calendario (preferibilmente brevi e frequenti di essere utilizzabile in un test di unità/integrazione) utilizzando PropertyPlaceHolderConfigurer . Quindi, durante il test, verificate che il codice programmato (sia esso deriso o la cosa reale) sia stato invocato il numero corretto di volte nel dato (breve) lasso di tempo.

21

È possibile verificare l'esecuzione metodo effettivo utilizzando il JUnit regolare, ma per verificare se la @Scheduled(cron = "0 * * * * *") specificato è corretto è possibile utilizzare:

@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); 

} 

Ecco l'output:

Yesterday was : 2015/11/06 11:41:58 Friday 

Next Execution date: 2015/11/09 01:00:00 Monday 

Come l'ultima esecuzione (impostata su TriggerContext) era un venerdì, la prossima esecuzione sarà il lunedì successivo.

Stavo armeggiando con la spring api e ho trovato questa soluzione, spero che questo aiuti qualcuno come mi ha aiutato.

Problemi correlati