2013-06-26 10 views
30

Spring bietet die Möglichkeit, Aufgaben in bestimmten Intervallen zu planen und auszuführen, indem Anmerkungen verwendet werden, z. @ScheduledTesten @Scheduled im Frühjahr

Gibt es eine bequeme Möglichkeit, dieses Verhalten zu testen?

Natürlich könnte ich die Methode der Bohne selbst nennen, aber ich möchte sicherstellen, dass ich nicht auf Probleme wie multiple executions due to misconfiguration und so weiter stoßen.

Andere Frameworks bieten die Möglichkeit, die Zeit selbst zu beschleunigen. Ein Beispiel dafür ist Activiti wo Sie

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

die Zeit vom Framework verwendet, um schnell vorwärts nennen.

Gibt es im Frühling etwas Vergleichbares?

Im Wesentlichen ist das, was ich tun möchte, so etwas wie dies in einem Unit-Test (Lauf mit 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))); 
} 

Antwort

0

Testen Sie den geplanten Code durch die Bean direkt aufrufen.

testen dann die Terminierung Konfiguration von:

1) Ihren Code in einer Testumgebung bereitstellen, lässt sie für eine Weile laufen und Inspektion von Protokollen und/oder Ergebnisse (vorausgesetzt, der geplante Code macht einige Protokollierung und/oder produziert sichtbare Ergebnisse) danach.

oder

2) die Scheduling-Konfiguration in Spring XML-Konfiguration unter Verwendung des <task: /> Namensraum und Einspritzen eine Einheit testspezifischen Intervall/Zeitplan (vorzugsweise kurz und häufig verwendbar zu sein in einer Einheit/Integrationstest) unter Verwendung von Externalisierung PropertyPlaceHolderConfigurer . Dann vergewissere dich in deinem Test, dass der geplante Code (egal ob verspottet oder echt) innerhalb der vorgegebenen (kurzen) Zeit richtig aufgerufen wurde.

21

Sie können die tatsächliche Ausführung der Methode testen Sie die regelmäßige JUnit verwenden, aber zu testen, ob die @Scheduled(cron = "0 * * * * *") Sie richtig angegeben ist, können Sie verwenden:

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

} 

Hier ist die Ausgabe:

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

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

Wie Die letzte Ausführung (in der TriggerContext festgelegt) war ein Freitag, die nächste Ausführung wird am folgenden Montag sein.

Ich habe mit der Spring API geprügelt und ich fand diese Lösung, ich hoffe das hilft jemandem, da es mir geholfen hat.