복붙노트

[SPRING] @IfProfileValue를 사용하여 프로필이 활성 상태인지 테스트하려면 어떻게해야합니까?

SPRING

@IfProfileValue를 사용하여 프로필이 활성 상태인지 테스트하려면 어떻게해야합니까?

혼란스럽게 @IfProfileValue는 @Profile 또는 @ActiveProfiles와 아무 관련이 없습니다. @Profile은 프로파일이 활성 상태인지 테스트하여 @ActiveProfiles가 프로파일을 활성으로 설정하고 @IfProfileValue를 사용하여 Spring 환경에서 내용을 확인할 수 있도록합니다. 위트? 나는 그들 모두를 비난하고 @IfEnvironment, @IfProfile, @ActivateProfiles와 같은 것들을 새로 추가 할 것이다.

주석을 제외하고, @IfProfileValue를 사용하여 프로필이 활성 상태인지 여부를 어떻게 확인할 수 있습니까? 나는 현재이 프로젝트에서 Spring Boot를 사용하지 않고있다. 대답에는 코드가 표시되어야하며 프로필이 @ActiveProfiles ( "test")로 활성화 된 경우 테스트를 실행한다고 가정합니다.

@IfProfileValue (name = "activeProfiles", value = "test")를 시도했지만 테스트가 건너 뛰었습니다. 이는 일치하지 않음을 의미합니다. 문제는 ActiveProfiles가 Collection이라는 사실과 관련이있을 수 있습니다.

해결법

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

    1.맞습니다. 자세한 내용은 https://stackoverflow.com/a/23627479/388980에서 설명했습니다.

    맞습니다. 자세한 내용은 https://stackoverflow.com/a/23627479/388980에서 설명했습니다.

    어제 내 대답에 대해 당신이 논평 한 이후에, 당신이 이미 본 것으로 가정합니다.

    @IfProfileValue가 @Profile 또는 @ActiveProfiles와 아무런 관련이없는 이유는 프레임 워크의 발전 때문입니다. 자세한 내용은 아래를 참조하십시오.

    이 진술은 완전히 정확하지는 않습니다. 특히 마지막 부분.

    @Profile은 ApplicationContext에 대한 Spring 환경에서 이름이 지정된 bean 정의 프로파일 중 하나가 활성화 된 경우 구성 요소 (예 : @Service 등), @Configuration 클래스 또는 @Bean 메소드를 선택적으로 활성화하는 데 사용됩니다. 이 주석은 테스트와 직접 관련이 없습니다. @Profile은 테스트 클래스에서 사용하면 안됩니다.

    @ActiveProfiles는 통합 테스트를 위해 ApplicationContext를로드 할 때 어떤 bean 정의 프로파일 (예 : @Profile을 통해 선언 된 프로파일)을 활성화해야하는지 지정하는 데 사용됩니다.

    @IfProfileValue는 Spring 환경에서 내용을 검사하는 것을 허용하지 않습니다. 나는 왜 이것이 가정하고 있는지 모르겠다. 스프링 프레임 워크에있는 문서들 중 어느 것도 그것을 언급하지 않았기 때문이다. 위에서 언급 한 스레드에서 설명한 것처럼 :

    @IfProfileValue는 bean 정의 프로파일의 개념 이전에 Spring Framework 2.0에서 소개되었고 @ActiveProfiles는 Spring Framework 3.1에서 처음 소개되었습니다.

    앞서 언급 한 스레드에서 필자는 다음과 같이 지적했다.

    '프로파일'이라는 용어는 @IfProfileValue에 대한 의미를 고려할 때 오해의 소지가 있습니다. 핵심은 '프로필'대신 '테스트 그룹'(TestNG의 테스트 그룹)을 생각하는 것입니다. @IfProfileValue에 대한 JavaDoc의 예를 참조하십시오.

    그건, 그리고 ... 당신이 "프로필"이라고 말할 때 bean 정의 프로파일을 의미한다고 가정합니다.

    @ActiveProfiles를 사용하여 테스트 용 bean 정의 프로파일을 설정하는 경우, @ActiveProfiles를 통해 구성된 bean 정의 프로파일이 테스트의 ApplicationContext에 직접 설정되어 있으므로 @IfProfileValue를 사용하여 Bean 정의 프로파일이 활성 상태인지 확인할 수 없습니다. Java 시스템 특성이 아닙니다.

    그러나 spring.profiles.active 시스템 프로퍼티를 통해서만 빈 정의 프로파일을 설정한다면, @IfProfileValue가 실제로 시스템 프로퍼티와 함께 ​​작동하기 때문에 @IfProfileValue를 사용하여 빈 정의 프로파일이 활성인지를 결정할 수있다. 예를 들어, 다음을 사용할 수 있습니다.

    @IfProfileValue(name = "spring.profiles.active", value = "test")
    

    activeProfiles는 잘못된 속성 이름이므로 작동하지 않습니다. 올바른 시스템 특성 이름은 spring.profiles.active입니다. 자세한 내용은 AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME을 (를) 참조하십시오.

    @IfProfileValue가 @ActiveProfiles와 조화를 이루지 않는다는 사실은 Spring 팀에 알려진 문제입니다. 자세한 내용은 다음 JIRA 쟁점을 참고하고 원할 경우 토론에 참여하십시오.

    희망이 당신을 위해 상황을 명확히!

    Sam (Spring TestContext Framework 작성자)

  2. ==============================

    2.샘이 그것을 제압했다. (이 사실이 받아 들여졌고 몇 년 전에 답을 얻었을뿐만 아니라)

    샘이 그것을 제압했다. (이 사실이 받아 들여졌고 몇 년 전에 답을 얻었을뿐만 아니라)

    한 가지 추가해야 할 점은 시스템 속성을 테스트에 통과 시키려면 gradle과 같은 빌드 도구를 사용하는 경우 JVM으로 전파하는 것이 추가 단계가 필요할 수도 있다는 것입니다.

    //build.gradle
    tasks.withType(Test) {
        systemProperties System.properties
    }
    

    그런 다음 통합 테스트에서 평상시처럼 비즈니스하십시오.

    //MyIntegrationTest.class
    @RunWith(SpringRunner.class)
    @SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
    @ActiveProfiles("integration")
    @IfProfileValue(name = "run.integration.tests", value = "true")
    public class MyIntegrationTest {
        @Test
        public void myTest(){ ... }
    }
    

    마지막으로 지정한 속성으로 터미널에서 테스트를 실행할 수 있습니다.

    $> ./gradlew clean test -Drun.integration.tests=true
    

    @IfProfileValue에 대해 System.property를 잡아 내고 assumeTrue / False를 수동으로 확인하는 것이 Spring 컨텍스트가로드되지 않았거나 단위 테스트를 빠르게 유지하는 것입니다.

  3. from https://stackoverflow.com/questions/33016848/how-can-i-use-ifprofilevalue-to-test-if-a-profile-is-active by cc-by-sa and MIT license