인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

bamho님의 프로필 이미지

작성한 질문수

Practical Testing: 실용적인 테스트 가이드

Business Layer 테스트 (1)

@Value 관련 환경변수 주입 테스트코드 질문..

작성

·

116

0

@ActiveProfiles("test")
@SpringBootTest
class CategoryServiceTest {

    @Autowired
    private CategoryService categoryService;

    @DisplayName("카테고리 목록들을 조회한다.")
    @Test
    void getAllCategories() {
        System.out.println("222222222222222222");
    }

}
@Service
@RequiredArgsConstructor
public class KakaoApiService {

    @Value("${social.kakao.apikey}")
    private String kakaoApiKey;

    @Value("${social.kakao.redirect_uri}")
    private String kakaoRedirectUri;
}

위와 같이 코드가 있을때 테스트 코드를 실행시키면
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'kakaoApiService': Injection of autowired dependencies failed
다음과 같은 에러가 발생하는데,, @SpringBootTest를 돌릴때 환경변수 주입을 못받아서 실패하는것 같은데 이럴 경우 어떻게 테스트를 진행해야할까요 ?? 전혀 관련 없는 서비스인데 에러가 터져서 진행이 안됩니다 ㅜㅜ..
```yml

spring:
  profiles:
    default: local

social:
  kakao:
    apikey: ${KAKAO_API_KEY}
    redirect_uri: ${KAKAO_REDIRECT_URI}

jwt:
  secret: ${JWT_SECRET}
  access_expiration_time: 36000000

---
# 테스트 환경
spring:
  config:
    activate:
      on-profile: test

  h2:
    console:
      enabled: true

  datasource:
    url: jdbc:h2:mem:~/ChallengeApplication
    driver-class-name: org.h2.Driver
    username: sa
    password:

  jpa:
    hibernate:
      ddl-auto: create
    show-sql: true
    properties:
      hibernate:
        format_sql: true

yml은 전체는 아니지만 이렇게 구성되어 있습니다.

image.png
  • 환경 변수주입은 ChallengeApplication에 다 넣어놨는데, 이게 테스트코드를 돌릴시에는 ChallengeApplication가 도는게 아니라 Junit 하위에 있는게 돌아서 환경변수 주입이 안된게 돌아서 실행이 안되더라구요 .. 보통 어떤식으로 하시나요 ? ㅠㅠ

답변 2

0

박우빈님의 프로필 이미지
박우빈
지식공유자

안녕하세요, bamho 님!

전체 프로젝트를 확인한 것은 아니지만, 보통 test yml 프로파일에 테스트용 값을 직접 명시하면 Value로 잘 주입될 거예요.
차선책으로 해당 객체의 사용처를 고려하여 MockBean 처리를 하는 방법도 있으니 참고해 주세요.

감사합니다. 🙂

bamho님의 프로필 이미지
bamho
질문자

네 test yml에 직접 명시하면은 보통 ignore 처리하고 관리하시나요 ?!

박우빈님의 프로필 이미지
박우빈
지식공유자

test profile에 두기 때문에 ignore 처리해야 할 상황이 뭐가 있을지 잘 모르겠네요. 필요하다면 ignore 처리하고 없으면 굳이 하지 않아도 될 것 같아요.

bamho님의 프로필 이미지
bamho
질문자

근데 하나의 application.yml 에서 profile로 분리하여 test profile 에 두고 test profile에 직접 카카오 api key 같은 경우 직접 주입하면은 application.yml에 보이는거 아닌가요 ? ㅠㅠ

박우빈님의 프로필 이미지
박우빈
지식공유자

저는 @Value로 가져오려는 값 자체가 없는 것이 문제 상황이라고 이해해서, 테스트 key는 정말 key로써 기능하는 문자열이 아닌 아무 문자열(ex. "test123")을 넣으면 되지 않나 라고 생각했던 것인데요.
그런 상황이 아니고 테스트 상황에서도 실제로 동작하는 key를 써야한다면 MockBean과 같이 다른 방법으로 접근해볼 것 같아요.

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다.

bamho님, 테스트 실행 시 환경 변수가 주입되지 않아 발생하는 문제를 해결하려면 다음과 같은 방법을 시도해 볼 수 있습니다:

  1. 테스트 환경 속성 명시: 테스트 코드에서 사용할 환경 변수를 명시적으로 설정할 수 있습니다. @SpringBootTest에서 properties 속성을 사용하여 환경 변수를 설정할 수 있습니다.
   @SpringBootTest(properties = {
       "social.kakao.apikey=test-apikey",
       "social.kakao.redirect_uri=http://localhost/test-redirect"
   })
   class CategoryServiceTest {
       // 테스트 코드 내용
   }
  1. 테스트 속성 파일 사용: 테스트에 필요한 속성을 src/test/resourcesapplication-test.yml 또는 application-test.properties 파일에 정의하고, 이를 활성화하는 방법입니다. 설정 파일에서 필요한 값을 직접 정의해 두면 좋습니다.

  2. Mock 사용: @MockBean을 사용하여 KakaoApiService를 목(Mock)으로 교체하여 환경 변수에 대한 의존성을 제거하는 방법도 있습니다.

위의 방법 중 적합한 방법을 사용해 보시기 바랍니다. 추가적으로 질문이 있으시면 언제든지 문의주세요! 🙏

Test configuration options are visible in an IDE for managing environment settings in tests.

정보 이해에 도움이 되길 바랍니다.

bamho님의 프로필 이미지

작성한 질문수

질문하기