작성
·
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은 전체는 아니지만 이렇게 구성되어 있습니다.
환경 변수주입은 ChallengeApplication에 다 넣어놨는데, 이게 테스트코드를 돌릴시에는 ChallengeApplication가 도는게 아니라 Junit 하위에 있는게 돌아서 환경변수 주입이 안된게 돌아서 실행이 안되더라구요 .. 보통 어떤식으로 하시나요 ? ㅠㅠ
답변 2
0
안녕하세요, bamho 님!
전체 프로젝트를 확인한 것은 아니지만, 보통 test yml 프로파일에 테스트용 값을 직접 명시하면 Value로 잘 주입될 거예요.
차선책으로 해당 객체의 사용처를 고려하여 MockBean 처리를 하는 방법도 있으니 참고해 주세요.
감사합니다. 🙂
test profile에 두기 때문에 ignore 처리해야 할 상황이 뭐가 있을지 잘 모르겠네요. 필요하다면 ignore 처리하고 없으면 굳이 하지 않아도 될 것 같아요.
근데 하나의 application.yml 에서 profile로 분리하여 test profile 에 두고 test profile에 직접 카카오 api key 같은 경우 직접 주입하면은 application.yml에 보이는거 아닌가요 ? ㅠㅠ
저는 @Value로 가져오려는 값 자체가 없는 것이 문제 상황이라고 이해해서, 테스트 key는 정말 key로써 기능하는 문자열이 아닌 아무 문자열(ex. "test123")을 넣으면 되지 않나 라고 생각했던 것인데요.
그런 상황이 아니고 테스트 상황에서도 실제로 동작하는 key를 써야한다면 MockBean과 같이 다른 방법으로 접근해볼 것 같아요.
0
안녕하세요, 인프런 AI 인턴입니다.
bamho님, 테스트 실행 시 환경 변수가 주입되지 않아 발생하는 문제를 해결하려면 다음과 같은 방법을 시도해 볼 수 있습니다:
@SpringBootTest
에서 properties
속성을 사용하여 환경 변수를 설정할 수 있습니다. @SpringBootTest(properties = {
"social.kakao.apikey=test-apikey",
"social.kakao.redirect_uri=http://localhost/test-redirect"
})
class CategoryServiceTest {
// 테스트 코드 내용
}
테스트 속성 파일 사용: 테스트에 필요한 속성을 src/test/resources
에 application-test.yml
또는 application-test.properties
파일에 정의하고, 이를 활성화하는 방법입니다. 설정 파일에서 필요한 값을 직접 정의해 두면 좋습니다.
Mock 사용: @MockBean
을 사용하여 KakaoApiService
를 목(Mock)으로 교체하여 환경 변수에 대한 의존성을 제거하는 방법도 있습니다.
위의 방법 중 적합한 방법을 사용해 보시기 바랍니다. 추가적으로 질문이 있으시면 언제든지 문의주세요! 🙏
정보 이해에 도움이 되길 바랍니다.
네 test yml에 직접 명시하면은 보통 ignore 처리하고 관리하시나요 ?!