2013-06-26 31 views
30

Mùa xuân cung cấp khả năng lên lịch và thực hiện các tác vụ tại các khoảng thời gian cụ thể bằng cách sử dụng chú thích, ví dụ: @ScheduledThử nghiệm @Scheduled vào mùa xuân

Có cách nào thuận tiện để đơn vị kiểm tra hành vi này không?

Tất nhiên tôi có thể gọi phương pháp của hạt mình, nhưng tôi muốn đảm bảo rằng tôi không gặp phải các sự cố như multiple executions due to misconfiguration và cứ tiếp tục như vậy.

Các khung công tác khác cung cấp khả năng tự chuyển tiếp nhanh thời gian. Một ví dụ là Activiti nơi bạn có thể gọi

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

để tua nhanh thời gian được khung sử dụng.

Có điều gì có thể so sánh trong mùa xuân không?

Về cơ bản những gì tôi muốn làm là một cái gì đó như thế này trong một thử nghiệm đơn vị (chạy bằng 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))); 
} 

Trả lời

0

Kiểm tra mã dự bằng cách gọi các đậu trực tiếp.

Sau đó, kiểm tra cấu hình lịch trình bởi:

1) triển khai mã của bạn trong một môi trường kiểm tra, để cho nó chạy một lúc và kiểm tra các bản ghi và/hoặc kết quả (giả sử mã lên kế hoạch thực hiện một số đăng nhập và/hoặc sản xuất kết quả hiển thị) sau đó.

hoặc

2) externalizing cấu hình lịch trong mùa xuân XML cấu hình bằng cách sử dụng namespace <task: /> và tiêm một đơn vị kiểm tra cụ thể khoảng thời gian/tiến độ (tốt nhất là ngắn và thường xuyên được sử dụng trong một đơn vị kiểm tra/lồng ghép) sử dụng PropertyPlaceHolderConfigurer . Sau đó, trong thử nghiệm của bạn xác minh rằng mã được lên lịch (có thể là nó được chế giễu hoặc thực tế) được gọi số lần thích hợp trong khoảng thời gian đã cho (ngắn).

21

Bạn có thể kiểm tra việc thực hiện phương pháp thực tế bằng cách sử dụng JUnit thông thường, nhưng để kiểm tra nếu @Scheduled(cron = "0 * * * * *") bạn đã xác định là đúng, bạn có thể sử dụng:

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

} 

Đây là kết quả:

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

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

Như lần thực hiện cuối cùng (được đặt trong số TriggerContext) là ngày Thứ Sáu, lần thực hiện tiếp theo sẽ vào thứ Hai sau.

Tôi đã không hài lòng với api mùa xuân và tôi tìm thấy giải pháp này, tôi hy vọng điều này sẽ giúp ai đó vì nó đã giúp tôi.