[Spring boot] 커스텀 설정 프로퍼티 클래스 Test 하기

Updated:

스프링 부트 커스텀 설정 클래스 사용하기

스프링 부트는 외부 설정 파일 설정을 properties or yml 파일을 통해 간단하게 제공 하고 있다. 그 중 한가지 방법을 사용하고 테스트 코드를 통해 확인 하는 방법을 소개 하고자 한다.

우선 예제로 사용할 간단한 설정 파일과 맵핑될 class 파일을 생성 한다.

application.yml

acme:
  remote-address: 192.168.1.1
  security:
    username: admin
    roles:
      - USER
      - ADMIN

AcmeProperties.clas

@Data
@Component
@ConfigurationProperties(prefix = "acme")
public class AcmeProperties {

    private boolean enabled;
    private InetAddress remoteAddress;
    private final Security security = new Security();

    @Data
    public static class Security {
        private String username;
        private String password;
        private List<String> roles = new ArrayList<>(Collections.singleton("USER"));
    }
}

사용한 Annotation 의미

Annotation Description
@Data getter/setter/toString 등 자동 생성 ( lombok )
@Component class를 Bean에 등록
@ConfigurationProperties 프로퍼티 값을 객체에 바인딩

@ConfigurationPropertiesprefix=acme 설정을 통해 application.ymlacme 하위에 있는 proeprties가 class에 맵핑 된다. ( prefix 설정 하지 않을 경우엔 root를 의미함 ) @Componet를 사용하여 container에 등록 해준다 .

위의 간단한 코드를 통해 spring-boot에서 load되는지 확인 해보자.

ExternalConfigApplication.class

@SpringBootApplication
public class ExternalConfigApplication {

	public static void main(String[] args) {
		SpringApplication.run(ExternalConfigApplication.class, args);
	}
}

MyService.class

@Service
public class MyService {

    private final AcmeProperties properties;

    @Autowired
    public MyService(AcmeProperties properties) {
        this.properties = properties;
    }

    @PostConstruct
    public void openConnection() {
        System.out.println(this.properties.getRemoteAddress());
        System.out.println(this.properties.getSecurity().getUsername());
        System.out.println(this.properties.getSecurity().getRoles());
    }
}

외부 설정파일을 값을 확인을 위해 간단한 @Service를 통한 확인 결과.

192.168.1.1
admin
[USER, ADMIN]

스프링 부트 커스텀 설정 클래스 Test 하기

AcmePropertiesTest.class

@RunWith(SpringRunner.class)
@EnableAutoConfiguration
@ContextConfiguration(classes = AcmeProperties.class, initializers = ConfigFileApplicationContextInitializer.class)
public class AcmePropertiesTest {

    @Autowired
    private AcmeProperties properties;

    @Test
    public void givenDefaultTPS_whenVariableRetrieved_thenDefaultFileReturned() {
        assertThat("192.168.1.1",  is(this.properties.getRemoteAddress()));
        assertThat("admin",  is(this.properties.getSecurity().getUsername()));
        assertThat(Arrays.asList("USER", "ADMIN"),  is(this.properties.getSecurity().getRoles()));
    }
}
Annotation Description
@RunWith 테스트러너 지정
@EnableAutoConfiguration Configure bean을 자동으로 등록
@ContextConfiguration 설정 파일의 위치를 지정할 때 사용

위 테스트 코드에서 @ContextConfigurationinitializers를 지정 해주지 않으면 application.ymlproperties을 읽어 오지 못 한다.

작성된 예제 코드는 github에 공개 되어 있습니다.

Leave a comment