2013-01-31 2 views
3

저는 구성 요소 테스트와 통합 테스트가 모두있는 애플리케이션에서 작업하고 있습니다. 그 차이는 다음과 같습니다. 두 개 이상의 클래스 (즉, 내부 객체가 모두 조롱 아웃되지는 ​​않지만 일부는 [JMS 게시자와 같은] 일 수 있습니다)의 구성 요소 테스트 테스트입니다. 통합 테스트는 모두가 조롱 당한다. 다시 말해, Spring은 객체를 제공하고 그대로 객체를 테스트합니다.테스트 실행 중 컨텍스트의 조롱 된 객체

지금까지 그렇게 좋았습니다.

문제는 Spring 컨텍스트에서 하나의 종속성 또는 다른 것을 대체 할 수 있기 위해 Spring 컨텍스트에서 일부 Bean을 조롱하는 방법을 제공하는 Springockito (https://bitbucket.org/kubek2k/springockito/wiki/Home)를 사용했습니다.

@RunWith(SpringJUnit4ClassRunner.class) 
@DirtiesContext(classMode = AFTER_CLASS) 
@ContextConfiguration(loader = SpringockitoContextLoader.class, locations = "classpath:spring-classify-test.xml") 
public class.... 

    @Autowired 
    @ReplaceWithMock 
    private SomeServiceInterface someServiceInterface; 
    @Autowired 
    private Bean bean; 

콩이 depedency로 SomeServiceInterface 있습니다

그래서 - - 컴포넌트 테스트에서 나는이 있습니다.

public class Bean { 
    private SomeServiceInterface... 

위의 경우 SomeServiceInterface는 모의로 바뀝니다. 물론, 그 예제는 문제의 단순화입니다. 나는 bean을 객체 그래프의 dependecies 인 mock 객체로 대체합니다.

spring-classify-test.xml 또한이 파일에서 컨텍스트를로드하는 것이 중요합니다. 또한 클래스를 실행 한 후에 컨텍스트를 더티라고 표시하는 것이 중요합니다. AFAIK, 다음 테스트 클래스는 컨텍스트를 다시로드하십시오.

좋아, 이제 통합 테스트 :

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(loader = SpringockitoContextLoader.class, locations = {"classpath:/spring-service-integration-test.xml" }) 
public class ... 

    @Autowired 
    private Bean bean; 

나는 봄 - 서비스 통합-test.xml의에서 컨텍스트를로드 - 콩의 내부하지만 SomeServiceInterface 여전히 조롱한다! 통합 테스트에 사용 된 컨텍스트도 변경되었습니다!

@DirtiesContext (classMode = ClassMode.AFTER_EACH_TEST_METHOD)로 통합 테스트를 표시하면 SomeServiceInterface가 조롱 되었기 때문에 클래스의 첫 번째 테스트가 실패하지만 컨텍스트가 이미 새로 고쳐 졌기 때문에 다음 테스트가 통과합니다.

재미 것입니다 : 내가 통합 테스트에 SomeServiceInterface을 주입하는 봄을 요구하는 경우에

는, 그것이 SomeServiceInterface 구체적인 구현을 주입합니다 -하지 모의를!

는 그 문제를 밖으로 정렬하는 많은 것들을 시도 :

1) 구성 요소 테스트가 컨텍스트

2) TestExecution 만들기에서 registerBeanDefinition 방법을 사용하여 수행 한 후, 프로그램 맥락에서 콩을 오버라이드 (override) 청취자는, 그래서 .... 다른 상황에 대해 동일한 로더를 사용) 수동으로 IntegrationTest

3의 실행하기 전에 컨텍스트를 다시 시도 할 수

4)이 이야기의 GOE 계속해서.

아무도 아이디어가 있습니까?

P.: Springockito를 채택하는 것은 모호한 생각이었습니다. 그러나 그 결정은 나에 의해 만들어지지 않았으며 이제는 프로젝트에서 500 가지가 넘는 테스트가 있습니다. 따라서 Springockito를 제거하기 위해 리팩터링하는 것은 긴박한 작업이 될 것이므로 실용적이지 않습니다. 옵션 ATM.

건배.

답변

1

@DirtiesContext 주석은 TestContextManager으로 등록하면 DirtiesContextTestExecutionListener으로 처리됩니다. 일반 바닐라 스프링 테스트를 사용하면 해당 리스너가 기본적으로 등록됩니다. 아마도 Springockito 또는 귀하의 테스트 "구성 요소 테스트"에서 뭔가 다른 기본 리스너 등록을 방해 뭔가를하고 있습니까?

+0

네, 그 리스너를 알고 있습니다. 코드를 디버그했으며 testContext.markContextAsDirty()가이 리스너에 의해 호출되었습니다. 필자는 청취자와 함께 놀고 ** 컴포넌트 테스트 **가 완료된 후 첫 번째 ** 통합 테스트 **가 실행되기 전에 스프링 컨텍스트를 강제로 갱신하는 사용자 정의 리스너를 만들려고했습니다. 작동하지 않았다 = ( – cldjr

관련 문제