b

SpringBoot, Junit5, EnableConfigurationProperties 본문

카테고리 없음

SpringBoot, Junit5, EnableConfigurationProperties

dev.bistro 2019. 7. 1. 13:36

2018년 3월 GatewayPropertiesTest 를 작성하다가 겪은 시행착오.

Junit5 (Jupiter)를 테스트하기 위한 방법으로 Spring5에서 SpringJUnitConfig 가 추가되었다.
쉽게 `@ExtendWith(SpringExtension.class) @SpringBootTest` 를 통합한 하나의 Annotation 이라고 생각해도 된다.

그래서 아래와 같은 방법으로 테스트를 작성할 수 있다.

@SpringJUnitConfig(classes = ElasticPropertiesTest.InnerConfiguration.class)
public class ElasticPropertiesTest {

    @Autowired String username;

    @Test
    public void testProperty() {
        Assertions.assertThat(username).isEqualTo("test");
    }
    @Configuration
    static class InnerConfiguration {
        @Bean
        public String beanStr() {
            return "test";
        }
    }
}

하지만, property를 주입받기 위한 방법으로는  아래처럼 @ConfigurationProperties를 사용하는 방법이 좀 더  일반적인데,  Configuration Slicing 을 통해서 테스트 코드를 작성하더라도 ConfigurationProperties가 제대로 동작하지 않는다. 

@Getter
@Setter
@ConfigurationProperties(prefix = "elastic")
public class ElasticProperties {
    private String username;
    private String password;
    private List<String> nodes;
}



@SpringJUnitConfig(classes = ElasticPropertiesTest.InnerConfiguration.class)
public class ElasticPropertiesTest {

    @Autowired
    ElasticProperties properties;

    @Test
    public void testProperty() {
        Assertions.assertThat(properties.getUsername()).isNotBlank();
    }

    @Configuration
    @EnableConfigurationProperties(ElasticProperties.class)
    static class InnerConfiguration {
    }
}

 

좀 더 확인을 위해서 
@SpringBootTest(classes = ElasticPropertiesTest.InnerConfiguration.class) 를 추가하면 정상 동작하는 것을 확인 할 수 있고,
`internalCachingMetadataReaderFactory` 이름을 가지는 Bean이 하나 추가 되고

이 3개의 PostProcessor가 추가된다.
0 = {SharedMetadataReaderFactoryContextInitializer$CachingMetadataReaderFactoryPostProcessor@2905} 
1 = {ConfigurationWarningsApplicationContextInitializer$ConfigurationWarningsPostProcessor@3832} 
2 = {ConfigFileApplicationListener$PropertySourceOrderingPostProcessor@3833} 

추가적으로 확인해본결과 application.yml 을 Property로 등록하지 않기 때문에 위의 테스트 방법이 정상적으로 수행되지 않는 것이었다. 

해결방법으로는
 @SpringJUnitConfig(classes = ElasticPropertiesTest.InnerConfiguration.class, initializers = ConfigFileApplicationContextInitializer.class) 명확하게 initializers 를 이용한다.

 

 

Comments