2014-03-31 4 views
2

I는 다음과 같이 주석 통합 테스트 클래스는 다음Spring : @PreDestroy가 각 테스트 클래스 끝에서 왜 호출되지 않습니까?

@WebAppConfiguration 
@ContextConfiguration(classes = {AppConfiguration.class}) 
@RunWith(SpringJUnit4ClassRunner.class)  
public class CacheConsumerTest { 

} 

을 다음 몇 가지 이유를 들어 내 AppConfiguration

@Configuration  
@ComponentScan(basePackages = {"com.etc.etc.etc."}) 
@EnableWebMvc 
public class AppConfiguration { 
} 

이다가, 내 @Component 콩 '@PreDestroyCacheConsumerTest에서 모든 테스트의 끝에서 호출지고의 없음 . 그러나 어떤 테스트가 실행되기 전에 시작시 @PostConstruct이 호출됩니다.

누구든지 문제가 무엇인지 알 수 있습니까? 내 @Component 중 일부는 @Predestroy를 호출하여 백그라운드 스레드를 종료하고 싶습니다. 그렇지 않으면 백그라운드에서 수행하는 작업으로 인해 다른 테스트 클래스의 후속 테스트가 실패하게됩니다.

@DirtiesContext(classMode=ClassMode.AFTER_CLASS)을 추가하려고했지만 도움이되지 않았습니다.

편집 : 그것은 모든 컨텍스트를 시작 캐시 만 모든 실행의 끝에서 그들을 파괴 : Does Spring @DirtiesContext reload Spring context?

답변

5

SpringJUnit4ClassRunner이 기능이 있습니다 : 문제를 파악, 나는 DirtiesContext 작품을 만들기 위해 추가 단계를해야했다 테스트 케이스. 그 이유는 새 스프링 컨텍스트가 시작될 때마다 전체 스위트에 필요한 시간이 크게 늘어나는 데 몇 초가 걸릴 수 있기 때문입니다.

그래서 정말로 필요한 경우 SpringJUnit4ClassRunner을 확장하고 컨텍스트를 캐시하지 않도록해야합니다. 아마도이 러너는 이미 그런 기능을 가지고 있지만 불행히도 지금은 확인할 수 없다고 생각합니다. 코드를 검사 해보십시오. 복잡하지 않고 솔루션을 신속하게 찾을 수 있습니다.

편집 :

그냥 @DirtiesContext하여 테스트 케이스를 주석. 자세한 내용은 here을 참조하십시오.