[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.프로필을 사용하지 않으려면 응용 프로그램에 대한 일정을 활성화 / 비활성화 할 플래그를 추가 할 수 있습니다
프로필을 사용하지 않으려면 응용 프로그램에 대한 일정을 활성화 / 비활성화 할 플래그를 추가 할 수 있습니다
AppConfiguration에서 이것을 추가하십시오.
@ConditionalOnProperty( value = "app.scheduling.enable", havingValue = "true", matchIfMissing = true ) @Configuration @EnableScheduling public static class SchedulingConfiguration { }
테스트에서이 주석을 추가하여 스케줄링을 비활성화하십시오.
@TestPropertySource(properties = "app.scheduling.enable=false")
-
==============================
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.구성 가능한 지연 시간을 사용하여 @Scheduled 주석을 매개 변수화했습니다.
구성 가능한 지연 시간을 사용하여 @Scheduled 주석을 매개 변수화했습니다.
@Scheduled(fixedRateString = "${timing.updateData}", initialDelayString = "${timing.initialDelay}")
내 테스트 application.yaml 있음 :
timing: updateData: 60000 initialDelay: 10000000000
그리고 주요 application.yaml :
timing: updateData: 60000 initialDelay: 1
이 기능을 끄지는 않지만 오랜 지연을 일으키기 때문에 테스트는 오래 전에 끝납니다. 가장 우아한 솔루션은 아니지만 내가 찾은 가장 쉬운 솔루션 중 하나입니다.
-
==============================
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
이렇게하면 프로덕션 코드에서와 다르게 테스트의 모든 설정을 구성 할 수 있습니다. 예를 들어, 정기적 인 테스트 대신 메모리 내 데이터베이스를 사용할 수 있습니다.
from https://stackoverflow.com/questions/29014496/disable-enablescheduling-on-spring-tests by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring @Autowired 및 @Qualifier [닫힘] (0) | 2018.12.24 |
---|---|
[SPRING] 서블릿 컨테이너를 다시 시작하지 않고 Spring 구성 파일을 다시로드 / 새로 고침 (0) | 2018.12.24 |
[SPRING] 스프링 IoC 및 일반 인터페이스 유형 [중복] (0) | 2018.12.24 |
[SPRING] ServletContext 리소스 [/WEB-INF/applicationContext.xml]을 열 수 없습니다. (0) | 2018.12.24 |
[SPRING] 스프링 MVC 사용자 정의 범위 Bean (0) | 2018.12.24 |