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
'코드 > dev' 카테고리의 다른 글
네트워크 기초 (4) | 2024.07.23 |
---|---|
jenkins memory error (0) | 2024.07.17 |
sync vs async, blocking vs non-blocking 차이 (0) | 2024.04.13 |
@async와 @transactional (0) | 2024.04.01 |
리소스 리팩토링(디렉토리 구조 및 클래스 생성및 서비스 구조 변경) (2) | 2024.03.20 |