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


93

배포 된 WAR의 XML Spring 구성을 확인하는 몇 가지 테스트를 작성하고 싶습니다. 불행히도 일부 빈은 일부 환경 변수 또는 시스템 속성을 설정해야합니다. @ContextConfiguration으로 편리한 테스트 스타일을 사용할 때 Spring Bean이 초기화되기 전에 환경 변수를 어떻게 설정할 수 있습니까?

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

주석으로 애플리케이션 컨텍스트를 구성하면 스프링 컨텍스트가 초기화되기 전에 뭔가를 할 수있는 후크가 표시되지 않습니다.

답변:


127

정적 초기화 프로그램에서 System 속성을 초기화 할 수 있습니다.

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

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

}

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


14
어리석은 날-좋아요, 그게 효과가 있습니다. 더 나은 @BeforeClass방법 : 아마도 시스템 속성을 설정하는 @AfterClass방법과이를 제거 하는 방법도 작동 할 것이고 그 자체로 멋지게 정리할 것입니다. (하지만 시도하지 않았습니다.)
Hans-Peter Störr

1
@BeforeClass을 시도 -과는 다른 속성은 테스트 인스턴스에 설정되기 전에 시스템 속성을 설정하는 벌금을 일
wbdarby

감사합니다. 정적 인 것은 작동하지 않았지만 @BeforeClass를 사용하는 작은 방법이 작동했습니다!
Midhun Agnihotram

이 메커니즘은 Log4j2 구성 파일 속성을 변경하는 경우 작동하지 않습니다. 어쨌든 Spring이 정적 코드 조각 전에로드되고 잘못 로깅되는 것 같습니다.
lucasvc

86

이를 수행하는 올바른 방법은 Spring 4.1부터 @TestPropertySource주석 을 사용하는 것 입니다.

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

Spring 문서Javadocs 의 @TestPropertySource를 참조하십시오 .


2
이 주석은 속성 파일 경로도 지원합니다.
MigDus

2
테스트 중에 Spring Cloud Config Client 레이블을 전환 할 수 있습니다.@TestPropertySource(properties={"spring.cloud.config.label=feature/branch"})
Marcello de Sales

4
좋은 대답이지만 슬프게도 Spring 4.2.9를 사용하여 저에게 효과가 없었습니다. 속성은 항상 비어있었습니다. 정적 블록 만 작동했습니다 ... 응용 프로그램 속성에는 작동했지만 시스템 속성에는 작동하지 않았습니다.
Gregor

처음에는 정적 버전 (작동)을보고 시도했지만이 주석은 훨씬 더 깨끗하고 훨씬 더 선호됩니다 (매력처럼 작동하기 때문에).
BAERUS

3
이것은 Environment"환경 변수"와 다른 속성을 제공합니다 .
OrangeDog

11

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

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

그런 다음 Spring 컨텍스트 구성 파일 위치 외에도 테스트 클래스에서 구성하십시오.

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

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


이것은 Spring Boot 2.x 및 Junit 5.x에서도 완벽하게 작동합니다 ( @SpringBootTest또는 테스트 슬라이싱 주석 사용)
Wim Deblauwe

11

여기의 모든 답변은 현재 설정하기가 더 복잡한 환경 변수, esp와 다른 시스템 속성에 대해서만 설명합니다. 테스트를 위해. 고맙게도 아래 클래스를 사용할 수 있으며 클래스 문서에는 좋은 예가 있습니다.

EnvironmentVariables.html

@SpringBootTest와 함께 작동하도록 수정 된 문서의 빠른 예제

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

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

EnvironmentVariables 규칙은 타사 라이브러리의 일부이며 해키 리플렉션을 사용하여 JVM 메모리에서 환경의 캐시 된 값을 변경하며 실제 환경 변수도 변경하지 않습니다. 그래서 나는 그것을 사용하거나 그렇게하도록 누구에게나 추천하고 싶지 않습니다.
Christian

4

변수가 모든 테스트에 유효하도록하려면 application.properties테스트 리소스 디렉토리 (기본값 src/test/resources:)에 다음과 같은 파일을 가질 수 있습니다 .

MYPROPERTY=foo

그런 다음 @TestPropertySource속성이로드되는 정확한 순서는 Spring 문서 24. Externalized Configuration 에서 찾을 수 있습니다 .


2

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

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

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

테스트 클래스 :

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

Eclipse에서 개별 테스트 클래스 또는 메서드를 실행하려면 다음을 수행하십시오.

1) 실행-> 구성 실행으로 이동하십시오.

2) 왼쪽에서 Junit 섹션에서 테스트 클래스를 선택하십시오.

3) 다음을 수행하십시오.

여기에 이미지 설명 입력


2

단위 테스트의 경우 응용 프로그램을 실행하는 서버가 없기 때문에 "mvn clean install"을 수행 할 때 시스템 변수가 아직 인스턴스화되지 않았습니다. 따라서 시스템 속성을 설정하려면 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>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.