복붙노트

[SPRING] 스프링 테스트에서 @EnableScheduling 사용 안함

SPRING

스프링 테스트에서 @EnableScheduling 사용 안함

단위 테스트를 실행하면 예약 된 작업이 호출됩니다. 내 기본 응용 프로그램 구성에 @EnableScheduling이 있다는 사실 때문에이 동작이 발생하지 않도록하고 싶습니다.

유닛 테스트에서 어떻게 비활성화 할 수 있습니까?

프로필 설정을 제안하는이 질문 / 답변을 보았습니다.

그걸 어떻게 알았 겠어? 또는 그 잔인한 경우? 나는 단위 테스트를 위해 별도의 AppConfiguration을 생각하고 있었지만, 그렇게 할 때 im이 두 번 반복 코드를 사용하는 것처럼 느껴졌습니까?

@Configuration
@EnableJpaRepositories(AppConfiguration.DAO_PACKAGE)
@EnableTransactionManagement
@EnableScheduling
@ComponentScan({AppConfiguration.SERVICE_PACKAGE,
                AppConfiguration.DAO_PACKAGE,
                AppConfiguration.CLIENT_PACKAGE,
                AppConfiguration.SCHEDULE_PACKAGE})
public class AppConfiguration {

    static final    String MAIN_PACKAGE             = "com.etc.app-name";
    static final    String DAO_PACKAGE              = "com.etc.app-name.dao";
    private static  final  String ENTITIES_PACKAGE  = "com.etc.app-name.entity";
    static final    String SERVICE_PACKAGE          = "com.etc.app-name.service";
    static final    String CLIENT_PACKAGE           = "com.etc.app-name.client";
    static final    String SCHEDULE_PACKAGE         = "com.etc.app-name.scheduling";


    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(){
       // stripped code for question readability
    }

    // more app config code below etc

}

단위 테스트 예제.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={AppConfiguration.class})
@Transactional
@TransactionConfiguration(defaultRollback = true)
@WebAppConfiguration
public class ExampleDaoTest {

    @Autowired
    ExampleDao exampleDao;

    @Test
    public void testExampleDao() {
        List<Example> items = exampleDao.findAll();
        Assert.assertTrue(items.size()>0);
    }
}

해결법

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

    1.프로필을 사용하지 않으려면 응용 프로그램에 대한 일정을 활성화 / 비활성화 할 플래그를 추가 할 수 있습니다

    프로필을 사용하지 않으려면 응용 프로그램에 대한 일정을 활성화 / 비활성화 할 플래그를 추가 할 수 있습니다

    AppConfiguration에서 이것을 추가하십시오.

      @ConditionalOnProperty(
         value = "app.scheduling.enable", havingValue = "true", matchIfMissing = true
      )
      @Configuration
      @EnableScheduling
      public static class SchedulingConfiguration {
      }
    

    테스트에서이 주석을 추가하여 스케줄링을 비활성화하십시오.

    @TestPropertySource(properties = "app.scheduling.enable=false")
    
  2. ==============================

    2.다른 방법으로는 이벤트를 스케쥴하는 빈 포스트 프로세서를 등록 해제하는 것입니다. 이 작업은 테스트의 클래스 경로에 다음 클래스를 추가하는 것만으로 수행 할 수 있습니다.

    다른 방법으로는 이벤트를 스케쥴하는 빈 포스트 프로세서를 등록 해제하는 것입니다. 이 작업은 테스트의 클래스 경로에 다음 클래스를 추가하는 것만으로 수행 할 수 있습니다.

    public class UnregisterScheduledProcessor implements BeanFactoryPostProcessor {
    
        @Override
        public void postProcessBeanFactory(final ConfigurableListableBeanFactory beanFactory) throws BeansException {
            for (String beanName : beanFactory.getBeanNamesForType(ScheduledAnnotationBeanPostProcessor.class)) {
                ((DefaultListableBeanFactory)beanFactory).removeBeanDefinition(beanName);
            }
        }
    }
    

    이 작업은 매우 간단하고 작업을 수행하는 것처럼 보입니다. 레지스트리에서 정의 된 빈을 제거하거나 PostProcessors의 순서가 문제가되지 않도록 가능한지 확인하십시오.

  3. ==============================

    3.구성 가능한 지연 시간을 사용하여 @Scheduled 주석을 매개 변수화했습니다.

    구성 가능한 지연 시간을 사용하여 @Scheduled 주석을 매개 변수화했습니다.

    @Scheduled(fixedRateString = "${timing.updateData}", initialDelayString = "${timing.initialDelay}")
    

    내 테스트 application.yaml 있음 :

    timing:
        updateData: 60000
        initialDelay: 10000000000
    

    그리고 주요 application.yaml :

    timing:
        updateData: 60000
        initialDelay: 1
    

    이 기능을 끄지는 않지만 오랜 지연을 일으키기 때문에 테스트는 오래 전에 끝납니다. 가장 우아한 솔루션은 아니지만 내가 찾은 가장 쉬운 솔루션 중 하나입니다.

  4. ==============================

    4.각 테스트에서 사용할 스프링 구성을 정의하면 현재 다음과 같은 결과를 얻을 수 있습니다.

    각 테스트에서 사용할 스프링 구성을 정의하면 현재 다음과 같은 결과를 얻을 수 있습니다.

    @ContextConfiguration(classes={AppConfiguration.class})
    

    일반적인 방법은 일반 응용 프로그램과 테스트에 대해 별도의 스프링 구성을 정의하는 것입니다.

    AppConfiguration.java 
    TestConfiguration.java
    

    그런 다음 테스트 할 때 @ContextConfiguration (classes = {TestConfiguration.class})을 사용하여 현재 AppConfiguration 대신 TestConfiguration을 사용하면됩니다.

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes={TestConfiguration.class})
    @Transactional
    @TransactionConfiguration(defaultRollback = true)
    @WebAppConfiguration
    public class ExampleDaoTest
    

    이렇게하면 프로덕션 코드에서와 다르게 테스트의 모든 설정을 구성 할 수 있습니다. 예를 들어, 정기적 인 테스트 대신 메모리 내 데이터베이스를 사용할 수 있습니다.

  5. from https://stackoverflow.com/questions/29014496/disable-enablescheduling-on-spring-tests by cc-by-sa and MIT license