2015-02-02 3 views
1

spring-REST (스프링 4.1.x) 테스트를 위해 스프링 테스트를 사용하는 응용 프로그램이 있습니다. 싱글 톤 빈 중 하나가 상태를 캐싱하여 사용할 수 있습니다 이 문제는 응용 프로그램에서 후속 호출을위한 것입니다. 비록 여러 Bean이 여러 테스트에서 사용 중이며 후속 테스트가 실패 할 때 여러 테스트를 실행할 때이 문제가 발생합니다. 제 질문은 teardown 상태를 어떻게 다시 설정합니까? State is not 클래스의 private 멤버는 같은 접근. 우리가? 내가 주석 콩을 사용하고 필요한 곳 ​​autowiring에하고있는 상황에서 완전히 빈을 제거 할 수 있습니다. 나는이 솔루션을 사용하려고테스트 중에 컨텍스트에서 싱글 톤 빈을 제거합니다.

@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
@ContextConfiguration(classes = ComponentTestConfig.class) 
public class WebServiceComponentTest { 

} 

다음 링크를 How can i remove a singleton spring bean from ApplicationContext?

에 주어진하지만 항상 ((BeanDefinitionRegistry에)의 BeanFactory) .removeBeanDefinition ("에서 myBean")에는 빈 정의를 찾을 수 없음으로 faiuls;

teardown이 Bean 상태를 재설정 할 때만 테스트가 실패합니다. 콩은 응용 프로그램에 의해 사용되는 동안 발견됩니다.

+0

'DirtiesContext' @, 이것은 당신이 새로운 애플리케이션 컨텍스트로 시작하게됩니다와 테스트 (또는 테스트 클래스)를 주석. –

+0

나는 stackoverflow 질문 중 하나를 보았다. 이것은 거의 사용되지 않아야하고 테스트가 느려질 것입니다. 저하되는 테스트 성능을 피하고 싶습니다. 그것은 CI 파이프 라인 당 모든 체크 인을 실행하기 때문에 ... 그것을 고칠 수있는 더 좋은 방법이 있습니까? – Milind

+0

당신이 원하는 것을 성취 할 수있는 유일한 방법은 믿을만한 방법이며, 지금까지 작성한 것을 재검토하고, 캐싱 메커니즘을 사용하는 대신 스프링 기반 캐싱 메커니즘 (특정 테스트에서는 비활성화 할 수 있음)을 사용하는 것이 유일한 방법입니다. –

답변

0

테스트 응용 프로그램 컨텍스트를보다 세부적으로 제어하려면 테스트를 위해 XML 구성 파일을 미러링하십시오. 테스트 클래스가 WebContent 디렉토리가 아닌 테스트 디렉토리에서 XML 파일 만로드하도록하십시오.

그런 식으로 테스트 컨텍스트에서 문제를 일으키는 클래스를 완전히 제외 할 수 있습니다. 그래서 테스트 XML은 다음과 같이 표시 될 수 있습니다

<context:component-scan base-package = 
    "au.com.foo.pineapple", 
    "au.com.foo.dolphin", 
    "au.com.foo.controllers" 
/> 
<!--au.com.foo.building--> 

이 같은 보일 수 있습니다 당신의 WebContent XML 파일 : M. Deinum는 지적

<context:component-scan base-package = 
    "au.com.foo.pineapple", 
    "au.com.foo.dolphin", 
    "au.com.foo.building", 
    "au.com.foo.controllers" 
/> 
0

,이를 달성하기위한 가장 안전한 방법은하는 것입니다 @DirtiesContext 주석을 사용하십시오.

그러나 위에서 언급 한 것처럼 @DirtiesContext을 사용하면 ApplicationContextContextCache에서 제거되므로 더 오래 테스트를 실행할 수 있습니다.

또 다른 옵션 - 정말를 해킹은 - 문제의 private 멤버의 상태를 변경 spring-test에서 ReflectionTestUtils 클래스를 사용하는 것입니다.

감사합니다,

샘 (스프링 TestContext 프레임 워크의 저자)