티스토리 뷰
[테스트코드] @ConfigurationProperties 클래스의 Bean 등록 방법과 두 개의 Bean 객체 등록으로 인한 @MockBean이 되지 않는문제
김쓰로그 2023. 6. 25. 23:39나는 이번 프로젝트에서 JWT(AccessToken+RefreshToken)을 활용하여 로그인 기능을 만들었다. 그래서 JWT 생성에 필요한 Issuer와 SecretKey를 .properties 설정파일에 입력한 뒤에 @ConfigurationProperties 어노테이션을 사용하여 하나의 클래스로서 관리하고자 하였다. 또한 이 클래스를 Bean 객체로 만들어 의존주입하여 편하게 사용하려고 클래스레벨에 @Component 어노테이션까지 붙여주었다.
오류상황
TokenProvider와 통합테스트 코드를 작성하고 있었다. JWT의 SecretKey는 노출되면안되기 때문에 .gitignore에 등록해놓았다. 그럼 나중에 CI/CD 파이프라인 구축할 때 당연히 JWT관련 properties파일이 없기에 테스트코드에 오류가 발생할 것이 보였다. 그래서 테스트코드전용 TestJwtProperties 클래스를 만들고 실제 JwtProperties에 의존하고 있는 클래스들에 한해 @MockBean을 주입하고 스텁을 설정하였다.
하지만 여기서 아래와 같은 오류가 발생하였다.
Caused by: java.lang.IllegalStateException: Unable to register mock bean com.developer.smallRoom.application.auth.jwt.JwtProperties expected a single matching bean to replace but found [jwt-com.developer.smallRoom.application.auth.jwt.JwtProperties, jwtProperties]
위의 오류를 해석해보면 mock bean을 등록할 수가 없다고하는데 그 이유가 싱글톤의 빈 객체를 기대했지만 두개의 빈객체가 발견되었다는 것이다.
오류이유 및 해결
@ConfigurationProperties가 붙은 클래스를 Bean객체로 등록하는 방법은 두 가지가 있다고 한다.
첫째 . 컴포넌트 스캔이 가능하도록 @Component 어노테이션을 붙여 Bean으로 등록하는 방법
둘째 . @EnableConfigurationProperties 어노테이션 value 속성에 해당 클래스를 지정하는 방법
이렇게 두가지가 존재하는데 나같은 경우 두 방법을 모두 사용하는 실수를 해버려서 동일한 클래스에 대한 Bean 객체가 두개 등록되어버려서 MockBean이 주입되지 않는것이였다.
그래서 @EnableComfigurationProperties에 설정을 지우니 @MockBean이 주입되고 테스트 코드가 성공하였다.
'오류' 카테고리의 다른 글
- Total
- Today
- Yesterday
- 4673번
- 파이썬
- 백준#서강근육맨#20300
- 1316번
- 회고
- 덧칠하기
- 백준
- 게시판#자바#JPA#Entity
- springboot
- MVC
- Spring
- 자바
- 사탕 게임#백준#3085
- 프로그래머스
- 백엔드#게시판
- list
- 스프링
- 대충 만든 자판
- this()
- arraylist
- 1978
- controller
- 서블릿#Servlet
- 백준#잃어버린 괄호#1541
- 7568
- 오류
- java
- 11659
- querydsl
- HTTP#HTTP특징
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |