저는 구성 요소 테스트와 통합 테스트가 모두있는 애플리케이션에서 작업하고 있습니다. 그 차이는 다음과 같습니다. 두 개 이상의 클래스 (즉, 내부 객체가 모두 조롱 아웃되지는 않지만 일부는 [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.
건배.
네, 그 리스너를 알고 있습니다. 코드를 디버그했으며 testContext.markContextAsDirty()가이 리스너에 의해 호출되었습니다. 필자는 청취자와 함께 놀고 ** 컴포넌트 테스트 **가 완료된 후 첫 번째 ** 통합 테스트 **가 실행되기 전에 스프링 컨텍스트를 강제로 갱신하는 사용자 정의 리스너를 만들려고했습니다. 작동하지 않았다 = ( – cldjr