728x90

이전에 다니던 회사에서는 배포시 test 코드 실행에 대해 큰 걱정을 하지 않았는데 야믈 파일에 환경변수가 설정이 되어  배포 되는 서버에서 환경번수를 넣어주기떄문에 

개발 서버 빌드시 개발 config 환경변수가 들어가고 운영서버 빌드 시에는 운영 config 환경변수가 들어오는

 

현재는 빌드시 해당 지정 profile을 읽고 있다. 

 

이떄 문제가 빌드시에는 default profile 을 읽고 있기떄문에 test 코드 실행시 문제가 되기 때문에  test 코드 실행 시 동적으로 읽을 필요가 있다. 

아래는 실제 Test 실패로 나온 경우다.

 

> Task :test

AsyncExceptionHandlingTest > 슬랙 알람 확인 FAILED
    java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:132
        Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException at ConstructorResolver.java:800
            Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException at ConstructorResolver.java:800
                Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException at ConstructorResolver.java:800
                    Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException at ConstructorResolver.java:800
                        Caused by: org.springframework.beans.factory.BeanCreationException at ConstructorResolver.java:658
                            Caused by: org.springframework.beans.BeanInstantiationException at SimpleInstantiationStrategy.java:185
                                Caused by: org.redisson.client.RedisConnectionException at ConnectionPool.java:153
                                    Caused by: java.util.concurrent.CompletionException at CompletableFuture.java:368
                                        Caused by: io.netty.channel.ConnectTimeoutException at AbstractNioChannel.java:261

HowserPartnerApiApplicationTests > contextLoads() FAILED
    java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:132
        Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException at ConstructorResolver.java:800
            Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException at ConstructorResolver.java:800
                Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException at ConstructorResolver.java:800
                    Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException at ConstructorResolver.java:800
                        Caused by: org.springframework.beans.factory.BeanCreationException at ConstructorResolver.java:658
                            Caused by: org.springframework.beans.BeanInstantiationException at SimpleInstantiationStrategy.java:185
                                Caused by: org.redisson.client.RedisConnectionException at ConnectionPool.java:153
                                    Caused by: java.util.concurrent.CompletionException at CompletableFuture.java:368
                                        Caused by: io.netty.channel.ConnectTimeoutException at AbstractNioChannel.java:261

HowserTemplateTest > 쿠팡 OpenApiKey 유효성 테스트 FAILED
    java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:132
        Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException at ConstructorResolver.java:800
            Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException at ConstructorResolver.java:800
                Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException at ConstructorResolver.java:800
                    Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException at ConstructorResolver.java:800
                        Caused by: org.springframework.beans.factory.BeanCreationException at ConstructorResolver.java:658
                            Caused by: org.springframework.beans.BeanInstantiationException at SimpleInstantiationStrategy.java:185
                                Caused by: org.redisson.client.RedisConnectionException at ConnectionPool.java:153
                                    Caused by: java.util.concurrent.CompletionException at CompletableFuture.java:368
                                        Caused by: io.netty.channel.ConnectTimeoutException at AbstractNioChannel.java:261

 

 

문제를 해결할 방법을 찾아보니  여러 방법이 있지만 

일단 현 시점에 가장 맞는 2가지 방법을 찾았다. 

 

1. ActiveProfilesResolver를 이용하여 test 코드 빌드 시 동적 profile을 적용하도록 변경

먼저 profile 을 동적으로 적용해주기 위해  ActiveProfilesResolver를 구현

 

import org.springframework.test.context.ActiveProfilesResolver;
 
public class SpringActiveProfilesResolver implements ActiveProfilesResolver {
    private static final String SPRING_PROFILES_ACTIVE = "spring.profiles.active";
 
    @Override
    public String[] resolve(Class<?> testClass) {
        String property = System.getProperty(SPRING_PROFILES_ACTIVE);
        return new String[] {property};
    }
}
//위 파일을 넣기 위해서는 dependency spring test 추가 필요

 

위와 같이 생성 후  아래와 같이 테스트 클래스를 만들어 준다. 

import com.example.demo.resolver.SpringActiveProfilesResolver;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import static org.junit.jupiter.api.Assertions.*;
 
@SpringBootTest
@ActiveProfiles(resolver = SpringActiveProfilesResolver.class)
class ActiveProfilesTest {
	@Value("${spring.config.activate.on-profile}")
    private String profile;
 
    @Test
    @DisplayName("ActiveProfilesResolver를 이용하여 값을 local로 세팅하고 테스트한다.")
    void test() {
        assertEquals(profile, "prod");
    }
}

 

위와같이 생성이 완료되면 

 

아래와 같이 VM 옵션을 적용하여 확인해준다. 

 

나의 경우는 build 시에 필요하여  빌드에 해당 옵션 넣어서 테스트를 진행하였다. 


 

2번째 방법

gradle test task  옵션  추가 아래 실제 추가 이미지

 

위와 같이 속성 지정 후 1번 방법의  vm 추가하면 잘 적용되는것을 확인 할 수 있다. 

 

항상 설정을 잘 확인하고 정확하게 알고 사용하자..

 

 

728x90

+ Recent posts