복붙노트

[SPRING] 메타 주석 및 테스트 클래스에서 @ActiveProfiles가 작동하지 않음

SPRING

메타 주석 및 테스트 클래스에서 @ActiveProfiles가 작동하지 않음

스프링 기반 단위 테스트에서 사용할 두 개의 프로파일을 활성화하는 메타 주석 @EmbeddedMongoDBUnitTest를 만들었습니다. 기본 설정 작동 :

@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 {
    ...
}

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

해결법

  1. ==============================

    1.이것은 버그가 아니므로 의도적으로 설계된 것입니다.

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

    이것이 작동하지 않는 이유는이 구성 형식이 Spring에 의해 지원되지 않는다는 것입니다.

    애노테이션을 검색 할 때 스프링 프레임 워크가 사용하는 알고리즘은 찾은 애노테이션이 처음 발견되었을 때 멈 춥니 다. 따라서 예제에서 NotWorkingTest의 @ActiveProfiles 주석은 구성된 @EmbeddedMongoDBUnitTest 주석의 @ActiveProfiles 주석을 효과적으로 음영 처리합니다.

    이것들은 핵심적인 Spring 프레임 워크에서 주석에 대한 일반적인 의미론이다. 즉, 발생한 동작은 스프링 테스트 모듈과 관련이 없습니다.

    즉, @ActiveProfiles를 통해 선언 된 프로파일은 사실 테스트 클래스 계층 구조에서 상속됩니다 (inheritProfiles 플래그를 false로 설정하지 않은 경우). 하지만 클래스 계층을 주석 계층과 혼동하지 마십시오. Java는 인터페이스 및 클래스에 대한 상속을 지원하지만 주석에 대해서는 상속을 지원하지 않습니다.

    희망이 물건을 명확히!

    샘 (스프링 테스트 모듈의 구성 부품 리드)

  2. from https://stackoverflow.com/questions/26176038/activeprofiles-in-meta-annotation-and-on-test-class-not-working by cc-by-sa and MIT license