1. 개요

이 사용방법(예제)에서는 Spring의 테스트에서 속성을 재정의하는 다양한 방법을 살펴보겠습니다.

Spring은 실제로 이에 대한 많은 솔루션을 제공하므로 여기에서 살펴볼 내용이 상당히 많습니다.

2. 의존성

물론 Spring 테스트를 사용하려면 테스트 의존성을 추가해야 합니다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <version>2.7.2</version>
    <scope>test</scope>
</dependency>

이 의존성에는 JUnit 5도 포함됩니다.

3. 설정

먼저 속성을 사용할 응용 프로그램에서 클래스를 만듭니다.

@Component
public class PropertySourceResolver {

    @Value("${example.firstProperty}") private String firstProperty;
    @Value("${example.secondProperty}") private String secondProperty;

    public String getFirstProperty() {
        return firstProperty;
    }

    public String getSecondProperty() {
        return secondProperty;
    }
}

다음으로 값을 할당합니다. src/main/resources 에 application.properties 를  생성하여 이를 수행할 수 있습니다 .

example.firstProperty=defaultFirst
example.secondProperty=defaultSecond

4. 속성 파일 재정의

이제 속성 파일을 테스트 리소스에 넣어 속성을 재정의합니다. 이 파일은 기본 파일 과 동일한 클래스 경로에 있어야 합니다 .

또한  기본 파일에 지정된 모든 속성 키를 포함 해야 합니다. 따라서 application.properties 파일을 src/test/resources 에 추가합니다 .

example.firstProperty=file
example.secondProperty=file

솔루션을 사용할 테스트도 추가해 보겠습니다.

@SpringBootTest
public class TestResourcePropertySourceResolverIntegrationTest {

    @Autowired private PropertySourceResolver propertySourceResolver;

    @Test
    public void shouldTestResourceFile_overridePropertyValues() {
        String firstProperty = propertySourceResolver.getFirstProperty();
        String secondProperty = propertySourceResolver.getSecondProperty();

        assertEquals("file", firstProperty);
        assertEquals("file", secondProperty);
    }
}

이 방법은 파일에서 여러 속성을 재정의하려는 경우 매우 효과적입니다.

파일에 example.secondProperty  를 넣지 않으면 애플리케이션 컨텍스트가 이 속성을 발견하지 못합니다.

5. 스프링 프로필

이 섹션에서는 Spring Profiles를 사용하여 문제를 처리하는 방법을 배웁니다. 이전 방법과 달리 이 방법 은 기본 파일과 프로파일링된 파일의 속성을 병합합니다 .

먼저 src/test/resources 에 애플리케이션 test.properties 파일을 생성해 보겠습니다.

example.firstProperty=profile

그런 다음 테스트 프로필 을 사용할 테스트를 만듭니다 .

@SpringBootTest
@ActiveProfiles("test")
public class ProfilePropertySourceResolverIntegrationTest {

    @Autowired private PropertySourceResolver propertySourceResolver;

    @Test
    public void shouldProfiledProperty_overridePropertyValues() {
        String firstProperty = propertySourceResolver.getFirstProperty();
        String secondProperty = propertySourceResolver.getSecondProperty();

        assertEquals("profile", firstProperty);
        assertEquals("defaultSecond", secondProperty);
    }
}

이 접근 방식을 사용하면 기본값과 테스트 값을 모두 사용할 수 있습니다. 따라서 이것은 파일에서 여러 속성을 재정의해야 하지만 여전히 기본 속성도 사용하려는 경우에 좋은 방법 입니다.

Spring Profiles 문서 에서 Spring 프로필에 대해 자세히 알아볼 수 있습니다 .

6. @SpringBootTest

속성 값을 재정의하는 또 다른 방법은 @SpringBootTest 어노테이션을 사용하는 것입니다.

@SpringBootTest(properties = { "example.firstProperty=annotation" })
public class SpringBootPropertySourceResolverIntegrationTest {

    @Autowired private PropertySourceResolver propertySourceResolver;

    @Test
    public void shouldSpringBootTestAnnotation_overridePropertyValues() {
        String firstProperty = propertySourceResolver.getFirstProperty();
        String secondProperty = propertySourceResolver.getSecondProperty();

        Assert.assertEquals("annotation", firstProperty);
        Assert.assertEquals("defaultSecond", secondProperty);
    }
}

보시다시피 example.firstProperty재정의되었지만 example.secondProperty 는 재정의 되지 않았습니다 . 따라서 이것은 테스트에 대한 특정 속성만 재정의해야 할 때 훌륭한 솔루션입니다. 이것은 Spring Boot를 사용해야 하는 유일한 방법입니다.

7. TestPropertySourceUtils

이 섹션에서는 ApplicationContextInitializer에서 TestPropertySourceUtils 클래스를 사용하여 속성을 재정의하는 방법을 알아봅니다

TestPropertySourceUtils 에는 다른 속성 값을 정의하는 데 사용할 수 있는 두 가지 메서드가 있습니다

테스트에 사용할 이니셜라이저 클래스를 생성해 보겠습니다.

public class PropertyOverrideContextInitializer
  implements ApplicationContextInitializer<ConfigurableApplicationContext> {

    static final String PROPERTY_FIRST_VALUE = "contextClass";

    @Override
    public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
        TestPropertySourceUtils.addInlinedPropertiesToEnvironment(
          configurableApplicationContext, "example.firstProperty=" + PROPERTY_FIRST_VALUE);

        TestPropertySourceUtils.addPropertiesFilesToEnvironment(
          configurableApplicationContext, "context-override-application.properties");
    }
}

다음으로 context-override-application.properties 파일을 src/test/resources에 추가합니다.

example.secondProperty=contextFile

마지막으로 초기화 프로그램을 사용할 테스트 클래스를 만들어야 합니다.

@SpringBootTest
@ContextConfiguration(
  initializers = PropertyOverrideContextInitializer.class,
  classes = Application.class)
public class ContextPropertySourceResolverIntegrationTest {

    @Autowired private PropertySourceResolver propertySourceResolver;

    @Test
    public void shouldContext_overridePropertyValues() {
        final String firstProperty = propertySourceResolver.getFirstProperty();
        final String secondProperty = propertySourceResolver.getSecondProperty();

        assertEquals(PropertyOverrideContextInitializer.PROPERTY_FIRST_VALUE, firstProperty);
        assertEquals("contextFile", secondProperty);
    }
}

example.firstProperty 는  인라인 메서드에서 재정의되었습니다.

example.secondProperty 는 두 번째 메서드의 특정 파일에서 재정의되었습니다. 이 접근 방식을 사용하면 컨텍스트를 초기화할 때 다른 속성 값을 정의할 수 있습니다.

8. 결론

이 문서에서는 테스트에서 속성을 재정의할 수 있는 여러 가지 방법에 중점을 두었습니다. 또한 각 솔루션을 언제 사용할지 또는 경우에 따라 혼합할 시기도 논의했습니다.

물론 @TestPropertySource 어노테이션 사용할 수 있습니다.

항상 그렇듯이 이 기사의 예제 코드는 GitHub 에서 사용할 수 있습니다 .

Junit footer banner