2014-10-03 5 views
3

스프링 기반 단위 테스트에 사용할 두 개의 프로필을 활성화하는 메타 주석 @EmbeddedMongoDBUnitTest를 만들었습니다. 기본 설정이 작동합니다메타 주석과 테스트 클래스의 @ActiveProfiles가 작동하지 않습니다.

@Documented 
@Inherited 
@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
@ActiveProfiles({"embeddedMongoDB", "embeddedMongoDBUnitTest"}) 
public @interface EmbeddedMongoDBUnitTest { 
} 

@RunWith(SpringJUnit4ClassRunner.class) 
@EmbeddedMongoDBUnitTest 
@ContextConfiguration(...) 
public class WorkingTest { 
    ... 
} 

을 이제 테스트 클래스 자체에 대한 또 다른 @ActiveProfiles 주석과 다른 프로파일을 활성화하려고 할 때, @EmbeddedMongoDBUnitTest의 프로파일이 더 이상 활성화되지 않습니다

@RunWith(SpringJUnit4ClassRunner.class) 
@EmbeddedMongoDBUnitTest 
@ActiveProfiles({"h2IntegrationTests"}) 
@ContextConfiguration(...) 
public class NotWorkingTest { 
    ... 
} 

이 있습니까 이것이 작동하지 않는 이유 또는 이것이 스프링 테스트 코드의 버그입니까?

답변

4

이것은 버그가 아닙니다. 의도적으로 설계된 동작입니다.

이것이 작동하지 않는 이유는이 구성 형식이 Spring에서 지원되지 않기 때문입니다.

스프링 프레임 워크가 주석을 검색 할 때 사용하는 알고리즘은 찾은 주석의 첫 번째 항목을 찾으면 중지됩니다. 따라서 예에서 @ActiveProfiles 주석 (NotWorkingTest)은 @EmbeddedMongoDBUnitTest 주석의 @ActiveProfiles 주석을 효과적으로 음영 처리합니다.

핵심 스프링 프레임 워크의 특수 효과에 대한 일반적인 의미 체계입니다. 즉, 발생한 문제는 spring-test 모듈에만 해당되는 것이 아닙니다.

@ActiveProfiles를 통해 선언 된 프로파일 (당신이 falseinheritProfiles 플래그를 설정하지 않는 한) 사실 에서 테스트 클래스 계층 구조 내에서을 상속 그런 말로 미루어 보아. 그러나 클래스 계층을 주석 계층과 혼동하지 마십시오. Java는 인터페이스 및 클래스에 대한 상속을 지원하지만 주석에 대해서는 상속을 지원하지 않습니다.

희망 사항은 이것을 분명히합니다.

샘합니다 (spring-test 모듈의 구성 요소 리드) 탐사 샘

+0

감사합니다. 이것이 버그가 아니라면, 여기에 디자인에 의문을 제기하고 있습니다. 스프링 프레임 워크가 첫 번째 Annotation만을 검색한다는 것은 사실 일지 모르지만,이 경우에는 모든 @ActiveProfiles 주석이 실제로 검색 될 것으로 예상됩니다. 클래스 상속을 지원하는 경우. – James

+0

James, http://jira.spring.io에서 이러한 기능을 요청할 수있는 JIRA 문제를 자유롭게 작성해 주시면 고려해 보겠습니다. –

+0

@SamBrannen이 문제와 관련하여 JIRA 티켓이 있습니까? 나는 아직 그것을 찾을 수 없었다. – Anton