2014-09-21 1 views
0

시스템에 다양한 단위 테스트 클래스가 있으며 모두 AbstractContextTest이라는 중앙 테스트 클래스를 확장합니다. 고 말했다 추상 슈퍼 클래스는 일반적으로 다음과 같습니다 : 여기에서 주목해야 할Spring Test - Project 당 JavaConfig

@RunWith(SpringJUnit4ClassRunner.class) 
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class}) 
@ContextConfiguration(locations = {"/TestContext.xml"}) 
public class AbstractContextTest { 
    // Various utility methods that would be useful in a unit test. 
    ... 
} 

중요한 것은이 @ContextConfiguration 라인입니다. locations 속성을 사용하여 XML 파일에 저장된 테스트 응용 프로그램 컨텍스트를로드합니다. 상대 경로를 사용하면 다음 작업을 수행 할 수 있습니다.

  1. 내 수퍼 클래스를 자체 프로젝트에 배치합니다.
  2. AbstractContextTest 프로젝트를 테스트 수준 종속성으로 사용하도록 다른 프로젝트를 구성합니다.
  3. 내 프로젝트의 각 테스트 리소스에 동일한 이름의 TestContext.xml을 배치합니다.
  4. 모든 유닛 테스트를 실행할 때 각 프로젝트는 상대적 경로 지정으로 인해 로컬 TestContext.xml을 사용합니다.
  5. 모두 세계와 맞습니다.

이제 실제 질문을 위해 : 스프링 XML 응용 프로그램 컨텍스트의 중단 시절부터 스프링 용 JavaConfigs의 새로운 세상으로 이동하고 싶습니다. 이 패러다임에서 내 상대 경로 솔루션에 해당하는 솔루션이 있습니까? 그렇다면 어떻게 그걸 풀까요?

+0

이 대신 설정 파일 전략 클래스 설정 낫다. 당신은 계층 구조와 함께 플레이해야합니다. 나는 너의 세계가 잘 작동한다고 생각하는 첫번째 방법을 제안한다. [튜토리얼보기] (http://spring.io/blog/2011/06/21/spring-3-1-m2-testing-with-configuration-classes-and-profiles) – Xstian

답변

0

호기심이 많은 사람이라면 제가 끝내는 올바른 해결책을 제시 할 것입니다. 나는 이것이 실제로 chrylis가 묘사 한 것임을 확신하지만, 그 예를 보여 주거나 어떤 식 으로든 설명하는 것을 비꼬 듯이 거부했다., 당신이 (이 경우 "my.package.name.test"참조) abstract 슈퍼 클래스에 스캔 한 패키지와 일치하는 패키지로, src/test/java에서, 다른 프로젝트에 다음

@RunWith(SpringJUnit4ClassRunner.class) 
@TestExecutionListeners(DependencyInjectionTestExecutionListener.class) 
@ContextConfiguration(loader = AnnotationConfigContextLoader.class) 
public abstract class AbstractContextTest { 
    @Configuration 
    @ComponentScan(basePackages = "my.package.name.test", 
       includeFilters = @Filter(type = FilterType.ANNOTATION, 
              value = Configuration.class)) 
    static class ContextConfiguration {} 
} 

: 그래서 여기

abstract 슈퍼 클래스 자체입니다 컨텍스트 클래스를 사용하면 원하는 이름을 지정할 수 있습니다. 나는이 예를 들어, "TestContext"를 선택 : @ContextConfiguration 클래스에 대한 참조를 원하기 때문에 당신의 세계를 들어

package my.package.name.test; 

import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 

@Configuration 
@ComponentScan(basePackages = "package.under.test") 
public class TestContext {} 
0

각 프로젝트의 src/test/java에 동일한 이름의 @Configuration 클래스를 배치하여 동일한 효과를 얻을 수 있습니다. 그렇지만이 시점에서 당신은 지나치게 영리해질 가능성이 높습니다. 각 프로젝트마다 별도의 중간 추상 기본 테스트 클래스를 갖는 것이 좋습니다.

+0

하지만 무엇을해야합니까 그'@ Configuration' 클래스를 해결할 수있는'AbstractContextTest'? '@ ContextConfiguration'을 완전히 제거 할 수 있다고 말하면 즉시 일종의 흑 마술을 사용하게 될까요? –

+0

아니요, XML 파일에 동일한 이름을 사용하는 것과 똑같은 클래스 이름을 사용할 수 있습니다. – chrylis

+0

그러면'AbstractContextTest'가 그것을 참조하기 위해'TestContext' 클래스에 대한 가져 오기를 가질 것이라는 것을 의미하는'@ContextConfiguration (classes = {TestContext.class})'가됩니다. 이것은'AbstractContext' 프로젝트가'TestContext' 클래스의 모든 개별 버전을 임포트하기 위해 다른 모든 프로젝트에 의존해야 할 필요가 있습니다. 이 모든 프로젝트가 이미'AbstractContextTest' 프로젝트를 종속물로 가지고 있다는 것을 고려할 때 순환 의존성의 거대한 웹이 될 것입니다. 그래서 아니, 나는 전혀 효과가 없을 것이라고 확신합니다. –

0

@ContextConfiguration에는 XML 컨텍스트 대신 Java 구성 파일을 지정할 수있는 classes 특성이 있습니다. 그러나 클래스를 다루는 중이므로 Java 구성을 사용하여 클래스를 추가해야합니다.이 클래스를 가져 오기에 추가해야합니다. 결과적으로 구체적인 클래스없이 컴파일되지 않기 때문에 테스트 프로젝트에 @ContextConfiguration(classes = TestConfig.class)을 선언 할 수 없습니다. 나중에 다운 스트림 프로젝트에 다른 구현을 만들면 AbstractContextTest 프로젝트를 컴파일하는 데 도움이되지 않습니다. 이는 테스트에서 Java configs에 대해 명시해야 함을 의미하므로 좋은 방법입니다. 결국, 당신이 처음부터 별도의 프로젝트를 만든 이유가 있습니다.

개인적으로 필자는 관련 테스트에서 Spring 고유 주석이있는 두 개의 추가 라인을 선호합니다. ,

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = TestConfig.class) 
public class DownStreamProjectTest extends AbstractContextTest { 

    // tests 
} 

사이드 참고 : 첫 번째 라인 (일반 JUnit 테스트 반대) 그것이 봄 기반 테스트입니다 분명히 있음을 만들고, 두 번째 줄은 내가 관련 애플리케이션 컨텍스트 (들)을 찾아 나에게 말한다 DirtiesContextTestExecutionListener을 일반 테스트 클래스 계층 구조에 배치하는 것에 대한 조언이 있습니다. Spring이 각 테스트에 대한 전체 애플리케이션 컨텍스트를 다시 생성하게되므로 테스트 스위트의 턴 어라운드 시간이 크게 늘어날 것이다.