복붙노트

[SPRING] 테스트 @ 봄에 스케줄

SPRING

테스트 @ 봄에 스케줄

Spring은 주석을 사용하여 특정 간격으로 작업을 예약하고 실행할 수있는 가능성을 제공합니다. @ 스케줄링 된

이 동작을 단위 테스트하는 편리한 방법이 있습니까?

물론 bean 메서드를 직접 호출 할 수도 있지만 잘못된 구성 등으로 여러 번 실행하는 것과 같은 문제가 발생하지 않도록하고 싶습니다.

다른 프레임 워크는 시간을 빨리 앞당길 수있는 가능성을 제공합니다. 한 예로 Activiti가 있습니다.

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

프레임 워크에서 사용한 시간을 빨리 감기.

Spring과 비슷한 것이 있습니까?

본질적으로 내가하고 싶은 것은 유닛 테스트 (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)));
}

해결법

  1. ==============================

    1.일반 JUnit을 사용하여 실제 메소드 실행을 테스트 할 수 있지만 지정한 @Scheduled (cron = "0 * * * * *")가 올바른지 테스트하려면 다음을 사용하십시오.

    일반 JUnit을 사용하여 실제 메소드 실행을 테스트 할 수 있지만 지정한 @Scheduled (cron = "0 * * * * *")가 올바른지 테스트하려면 다음을 사용하십시오.

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

    출력은 다음과 같습니다.

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

    마지막 실행 (TriggerContext에서 설정)이 금요일 이었으므로 다음 실행은 다음 월요일에 수행됩니다.

    나는 스프링 API를 만지작 거리며이 해결책을 발견했다. 나는 이것이 나를 도울 때 누군가에게 도움이되기를 바란다.

  2. ==============================

    2.빈을 직접 호출하여 스케줄 된 코드를 테스트하십시오.

    빈을 직접 호출하여 스케줄 된 코드를 테스트하십시오.

    그런 다음 예약 구성을 테스트합니다.

    1) 테스트 환경에서 코드를 배포하여 잠시 실행하고 로그 및 / 또는 결과를 검사합니다 (예약 된 코드가 일부 로깅을 수행하거나 가시적 인 결과를 산출한다고 가정).

    또는

    2) PropertyPlaceHolderConfigurer를 사용하여 네임 스페이스를 사용하여 Spring XML 설정에서 스케쥴링 설정을 외부화하고 단위 테스트 특정 간격 / 스케쥴 (바람직하게 짧고 빈번한 유닛 / 통합 테스트에서 사용 가능)을 주입한다. 그런 다음 테스트에서 주어진 시간 (짧은 시간)에 예약 된 코드 (실제 조롱 된 코드인지)가 적절한 횟수만큼 호출되었는지 확인합니다.

  3. from https://stackoverflow.com/questions/17327956/testing-scheduled-in-spring by cc-by-sa and MIT license