source

스프링 테스트에서 환경 변수 또는 시스템 속성을 설정하는 방법은 무엇입니까?

gigabyte 2022. 9. 3. 13:25
반응형

스프링 테스트에서 환경 변수 또는 시스템 속성을 설정하는 방법은 무엇입니까?

배치된 WAR의 XML Spring 구성을 확인하는 테스트를 작성하려고 합니다.안타깝게도 일부 콩은 환경 변수 또는 시스템 속성을 설정해야 합니다.@ContextConfiguration에서 편리한 테스트 스타일을 사용하는 경우 스프링빈 초기화 전에 환경변수를 설정하려면 어떻게 해야 합니까?

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:whereever/context.xml")
public class TestWarSpringContext { ... }

애플리케이션 콘텍스트에 주석을 설정하면 스프링 콘텍스트가 초기화되기 전에 작업을 수행할 수 있는 후크가 표시되지 않습니다.

정적 이니셜라이저로 시스템 속성을 초기화할 수 있습니다.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:whereever/context.xml")
public class TestWarSpringContext {

    static {
        System.setProperty("myproperty", "foo");
    }

}

정적 이니셜라이저 코드는 스프링 애플리케이션 컨텍스트가 초기화되기 전에 실행됩니다.

4.1은 Spring 4.1을 하는 입니다.@TestPropertySource석입니니다다

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:whereever/context.xml")
@TestPropertySource(properties = {"myproperty = foo"})
public class TestWarSpringContext {
    ...    
}

것은, 을 참조하십시오.@TestPropertySourceSpring 문서Javadocs에 기재되어 있습니다.

이 답변은 모두 현재 시스템 속성에 대해서만 언급하고 있습니다.시스템 속성은 특히 테스트용으로 설정하기 복잡한 환경 변수와는 다릅니다.다행히, 아래 클래스는 그것을 위해 사용될 수 있고 클래스 문서는 좋은 예를 가지고 있습니다.

EnvironmentVariables.html

@SpringBoot에서 작동하도록 수정된 문서의 간단한 예시험

@SpringBootTest
public class EnvironmentVariablesTest {
   @ClassRule
   public final EnvironmentVariables environmentVariables = new EnvironmentVariables().set("name", "value");

   @Test
   public void test() {
     assertEquals("value", System.getenv("name"));
   }
 }

Application Context Initializer 테스트를 사용하여 시스템 속성을 초기화할 수도 있습니다.

public class TestApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext>
{
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext)
    {
        System.setProperty("myproperty", "value");
    }
}

다음으로 스프링 컨텍스트컨피규레이션파일 위치와 더불어 테스트클래스로 설정합니다.

@ContextConfiguration(initializers = TestApplicationContextInitializer.class, locations = "classpath:whereever/context.xml", ...)
@RunWith(SpringJUnit4ClassRunner.class)
public class SomeTest
{
...
}

이렇게 하면 모든 장치 테스트에 대해 특정 시스템 속성을 설정해야 하는 경우 코드 중복을 방지할 수 있습니다.

, 「」를 할 수 .application.properties디렉토리에 : "Default: "Default: "Default: "Default: "Default: "Default: "Default: "Default: "Default: "Default: "Resourcesource")src/test/resources

MYPROPERTY=foo

, 이 되는데, 라고 하는 정의가 한.@TestPropertySource또는 유사한 방법 - 특성이 로드되는 정확한 순서는 스프링 설명서 24장에서 확인할 수 있습니다. 외부 설정

시스템 속성을 VM 인수로 설정할 수 있습니다.

프로젝트가 메이븐 프로젝트인 경우 테스트 클래스를 실행하는 동안 다음 명령을 실행할 수 있습니다.

mvn test -Dapp.url="https://stackoverflow.com"

테스트 클래스:

public class AppTest  {
@Test
public void testUrl() {
    System.out.println(System.getProperty("app.url"));
    }
}

개별 테스트 클래스 또는 메서드를 일식으로 실행하려면 다음과 같이 하십시오.

1) [실행] -> [실행 설정]으로 이동합니다.

2) 왼쪽의 Junit 섹션에서 테스트 클래스를 선택합니다.

3) 다음을 수행합니다.

여기에 이미지 설명 입력

유닛 테스트의 경우 응용 프로그램을 실행하는 서버가 없기 때문에 "mvn 클린 설치"를 실행해도 시스템 변수가 아직 인스턴스화되지 않습니다.따라서 System 속성을 설정하려면 pom.xml로 설정해야 합니다.다음과 같은 경우:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.21.0</version>
    <configuration>
        <systemPropertyVariables>
            <propertyName>propertyValue</propertyName>
            <MY_ENV_VAR>newValue</MY_ENV_VAR>
            <ENV_TARGET>olqa</ENV_TARGET>
            <buildDirectory>${project.build.directory}</buildDirectory>
        </systemPropertyVariables>
    </configuration>
</plugin>

스프링부츠의 경우, 제 생각에 가장 간단한 방법은@SpringBootTestJava에서 할 수 있는 주석:

@SpringBootTest(
    properties = { "spring.application.name=example", "ENV_VARIABLE=secret" }
)
public class ApplicationTest {

    // Write your tests here

}

또는 코틀린에서는 다음을 수행할 수 있습니다.

@SpringBootTest(
    properties = ["spring.application.name=example", "ENV_VARIABLE=secret"]
)
internal class ApplicationKTest {

    // Write your tests here

}

주석에서 정의한 속성으로 덮어쓰기 테스트를 실행해야 합니다.예를 들어, 어떤 일이 일어났다고 칩시다.application.yml그렇게 보이는 것:

spring:
  application:
    name: "app"

db:
  username: "user"
  password: ${ENV_VARIABLE:default}

테스트 중에는 다음과 같이 됩니다.

  • 스프링 특성spring.application.name값이 반환됩니다."example"
  • 환경 변수ENV_VARIABLE돌아온다"secret"이 값을 사용하는 경우db.password당신의 코드로 그것은 돌아올 것이다."secret".

많은 테스트 클래스(기동 tomcat/server를 실행하는 IT 테스트)가 있고 테스트가 실패할 경우 시스템을 사용하여 시스템 속성을 설정해야 합니다.setProperty("ccm.configs.dir", configPath) : 스프링이 시작되기 전에 이 설정이 되어 있는지 확인해야 하므로 클래스 내 정적 컨텍스트에 저장해야 합니다.또한 종속되는 모든 테스트가 이 set system 속성을 얻도록 하려면 해당 변수를 설정하는 테스트폴더에 단순한 설정 클래스를 정의합니다.추신: 제 경우 필요한 env 변수는 "ccm.configs.dir"입니다.다음은 테스트 폴더에 추가한 내용입니다.

@Configuration
public class ConfigLoader {
  static {
    
    System.setProperty("ccm.configs.dir", "path/to/the/resource");
  }

}

모든 통합 테스트 클래스는 실행 시 이미 설정된 변수를 얻을 수 있었습니다.

언급URL : https://stackoverflow.com/questions/11306951/how-to-set-environment-variable-or-system-property-in-spring-tests

반응형