-
Junit Test 에서 Config 클래스의 Bean 생성하기IT/Unit Test 2021. 5. 11. 23:50
**테스트 코드를 작성하다 보면 본 프로젝트에 있는 Bean 객체들을 직접 사용해야 할 때가 있다.
실제로 프로젝트에서 s3 파일 업로드/다운로드 테스트를 위해 이러한 작업이 필요하여 작성한 테스트를 남긴다.
이중에 몇몇 Configuration 관련 Bean들은 application.yml 과 같은 파일의 설정과 엮여있는데, 이 설정을 그대로 사용하면서 Test 코드에서 Bean을 사용하는 방법을 알아보자.
테스트하려는 상황은 Test 코드에서 실제로 Bean을 사용하여 AWS s3의 presignedURL 을 할당받아 파일을 업로드하고, 그 업로드한 파일을 다운로드받는 일련의 연계된 테스트이다.
*src 폴더의 파일
AwsClient.java ( AWS client 클래스 )
AwsConfig.java ( AWS의 컴포넌트 관련 설정 클래스 )
*test 폴더의 파일
S3FileTest.java ( s3 파일 업로드,다운로드 테스트 클래스 )
1. AwsClient.java public class AwsClient { @Autowired private AwsConfig awsConfig; ... }
2. AwsConfig.java @ConfigurationProperties("aws") //application-local.yml 의 aws 항목 참조하여 client 값 설정 public class AwsConfig { private AwsClientConfig client; .... }
3. S3FileTest.java @ExtendWith(SpringExtension.class) @SpringBootTest() public class S3FileTest { @Autowired AwsConfig awsConfig; @Autowired AwsClient awsClient; @Value("${content.uploadUrlExpireTime}") long uploadUrlExpireTime; ... @Test void uploadFileS3(){ //test code ... } @Test void downloadFileS3(){ //test code ... } }
기본적인 코드의 구조는 위와 같다. 이런한 상황에서 Test코드에서 실제 Aws 관련 Config 클래스들을 주입하여 실제로 s3 upload와 download를 테스트하려 한다.
S3FileTest.java 파일에서 위와같이 코딩하고 실행하면, application-dev.yml 의 프로퍼티 설정들을 불러오지 못해 nullpointer exception 이 발생한다.
문제 해결을 위해 다음과 같이 변경된 S3FileTest 클래스를 보자.
@ExtentWith(SpringExtension.class) @SpringBootTest(classes={AwsConfig.class, AwsClient.class, ContentConfig.class}, properties = "spring.config.location=property/application-local.yml") @EnableConfigurationProperties(AwsConfig.class) public class S3FileTest { @Autowired AwsConfig awsConfig; @Autowired AwsClient awsClient; @Value("${aws.s3.uploadUrlExpireTime}") long uploadUrlExpireTime; @Test uploadFileS3() { //test code ... } @Test downloadFileS3() { //test code ... } }
* @SpringBootTest 어노테이션
- classes : 관련 옵션은 Test에 필요한 class들만 Bean으로 로딩하여 테스트 속도 저하를 막기 위해 설정하였다.
- properties : yml 파일을 원하는 위치로 설정해 주기 위해 사용하였다. 해당 프로젝트 같은 경우 프로젝트 메인의 property 폴더 내부에 application-{env}.yml 과 같은 형태로 prd, stg, dev가 구분되어 있으며, 빌드시 gradle에서 환경에 맞는 yml을 포함시킨다. 테스트는 로컬 환경에서 이루어지기 때문에 application-dev.yml 파일을 지정하였다.
* @EnableConfigurationProperties 어노테이션
- AwsConfig.java 파일의 @ConfigurationProperties("aws") 어노테이션을 활성화 시켜 yml의 property 값을 불러올 수 있게 하는 역할을 한다.
* @Value 어노테이션
- @SpringBootTest 어노테이션의 properties 설정에 입력된 yml에서 aws.s3.uploadUrlExpireTime 의 값을 변수에 주입한다.
위와 같은 설정을 사용하여 테스트 코드에서도 Src 내부의 특정 yml의 값을 참조하고, Bean을 생성하여 테스트를 수행할 수 있다. 프로젝트의 완성도나 유지보수 관점에서 테스트 코드의 중요성을 새삼 느끼는 요즘이다. 테스트코드를 짜는게 실제 로직 코드를 짜는 경우보다 난감하거나 어려울 때도 많은 것 같아 더 많은 경험이 필요함을 느낀다.
'IT > Unit Test' 카테고리의 다른 글
2. Test Double 의 개념 (0) 2020.09.11 1. 유닛 테스트(Unit Test) 의 기본 개념 (0) 2020.09.10