2012-04-27 8 views
1

모든 Spring Configurations를 Java 코드로 이동하는 중입니다. 필자는 이제 명령 줄 스위치 또는 메이븐 프로파일 등을 기반으로 어떤 프로파일을 사용하고 싶은지에 대한 문제를 겪었습니다 ... 또한 각 테스트마다 같은 주석을 모두 사용하지 않으려합니다 수업. 이것은 웹 애플리케이션이 아니라 오히려 기능적 테스트 스위트입니다. 내 테스트를 실행하려고 할 때Java Spring ApplicationContext Configuration

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = CompanyApplicationContextInitializer.class) 

는하지만, 내 autowire가 조각이 위치한되지 않는 :

public class CompanyApplicationContextInitializer 
    implements ApplicationContextInitializer<ConfigurableApplicationContext> { 

    @Override 
    public void initialize(final ConfigurableApplicationContext applicationContext) { 
    final AnnotationConfigApplicationContext rootContext = new AnnotationConfigApplicationContext(); 
    rootContext.getEnvironment().setActiveProfiles(System.getProperty("spring.profile.active", "local")); 
    rootContext.register(LocalConfiguration.class, SauceLabsConfiguration.class); 
    } 
} 

가 그럼 난 내 테스트는 다음과 같이 주석이 있습니다

여기 내 시도이다. 나는 바른 길을 가고 있는가? 어떻게하면이 클래스에서 와이어를 프로그래밍하여 ApplicationContext를 설정할 수 있습니까? 두 번째 주석에 앱 컨텍스트 XML의 위치를 ​​추가

답변

5

문제는 당신이 ApplicationContextInitializer 클래스 @ ContextConfiguration 번호 클래스를 전달하는 것입니다. #classes 속성은 Spring의 @Configuration 주석으로 표시된 클래스를 허용하기위한 것입니다.

ApplicationContextInitializer는 WebApplicationContext에 프로그래밍 방식으로 액세스하기 어려운 웹 응용 프로그램에서 주로 사용하기위한 것입니다. "contextInitializerClasses"init-param은 Spring DispatcherServlet에 전달 될 수 있으며 Spring은 적절한 시간에 ACI 구현을 호출하여 #refresh() 전에 응용 프로그램 컨텍스트를 조작 할 수 있습니다.

귀하의 경우에는 통합 테스트를위한 프로파일 활성화에만 관심이있는 것으로 보입니다. 따라서 ACI는 불필요합니다. Spring의 @ActiveProfiles 주석으로 통합 테스트를 표시하여 활성화 된 프로파일을 지정하십시오.

spring.profiles.active가 JVM 시스템 등록 정보 또는 환경 변수로 설정된 경우 지정된 프로필이 자동으로 활성화됩니다. 즉, ACI 구현에서와 같이 System # getProperty를 호출 할 필요가 없습니다. 그러나 ACI 구현의 논리에 기반하여 spring.profiles.active가 시스템 등록 정보 또는 환경 변수로 제공되면 note는 "local"이라는 프로파일로 폴백하려는 것으로 나타났습니다. 말 그대로 "default"라는 "예약 된 기본 프로필"이 있다는 것을 알고 싶을 것입니다. 이것은 아마도 "로컬"프로필로 찾고자하는 의미와 동일한 의미 일 것입니다. '로컬'프로필의 이름을 'default'로 변경하십시오.

마지막으로 @ContextConfiguration 클래스에 ApplicationContextInitializer 지원을 제공하기위한 개선 된 개선 요청이 있음을 유의하십시오. https://jira.springsource.org/browse/SPR-9011. 시계를 달고 싶을 수도 있습니다. 예를 들어 다른 프로파일이 활성화되어 있지 않으면 프로그래밍 방식으로 '로컬'을 활성화하는 간단한 옵션을 사용할 수 있습니다.

+0

모든 구성 옵션을 정의한 기본 테스트 클래스가 없기를 바랬지 만 현재 선택 사항이없는 것처럼 보입니다. 어느 프로파일이 각 테스트 클래스 (여기서는 JVM 속성으로 쉽게 수행 됨)에 활성화되어있는 것을 피할 수 있기를 바랬지 만 ContextConfiguration 주석을 각 테스트 클래스에 배치하지 않아도되도록하고 싶었습니다. 그래서 그것을 기본 레벨 테스트로 옮기면 그 문제가 완화 될 것입니다. – Scott

+0

@ActiveProfiles 주석은 기본 클래스에서 사용할 수 있으며 모든 하위 클래스에 적용됩니다. 또한이 주석은 inheritLocations라고하는 속성을 포함하여 여러 가지 속성을가집니다. Javadoc을 보라. –

1

시도 : 위의 예와

@ContextConfiguration(locations = { 
    "classpath:applicationContext.xml" 
}) 
+0

월요일에 가져올 때 시도 할 것이지만 현재 xml 파일이 없습니다. 이 콩을 선언하기 위해 하나를 추가합니까? 모든 Java 구성을 다른 곳에서 사용할 때는 카운터 직관적 인 것으로 보입니다. – Scott

+0

아니요, 시작할 때 앱 컨텍스트가로드되도록 주석을 변경하십시오. – duffymo

관련 문제