ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
Designed by Tistory.