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 에서 사용할 수 있습니다 .