SpringBoot 공부를 진행하며
간단한 Controller 및 테스트 코드를 작성하고
호출하여 정상 응답하여 통과하는것을 확인했다.
새로운 Controller, Service, Dto 파일을 추가하고
확인차 기존에 정상적으로 진행된 테스트(새로 추가한 코드의 테스트X)를 진행하였는데
오류가 발생했다.
Description:
Parameter 0 of constructor in com.springboot.web.ApiController required a bean of type 'com.springboot.service.ApiService' that could not be found.
Action:
Consider defining a bean of type 'com.springboot.service.*Service' in your configuration.
새로 추가한 ApiController 소스내의 선언된 ApiService Bean을 찾지못해 오류가 발생했다.
하지만 내가 실행한 테스트 코드는 ApiController과는 관련이 없는 테스트였다
관련이 있다해도, 어노테이션을 통해 의존성주입이 되었을텐데...
해당내용을 검색하여 찾은 결과.
거의 동일한 상황을 정리해주신 글을 발견했다.
https://velog.io/@readnthink/consider-defining-a-bean-of-type-in-your-configuration-Test-code
@WebMvcTest
: 여러 스프링 테스트 어노테이션 중, Web(Spring MVC)에 집중할 수 있는 어노테이션
Web Layer 관련 Bean들 (ex:Controller -)만 등록(Repository, Service 등은 등록되지않는다.)
오류가 발생한 코드
@RunWith(SpringRunner.class)
@WebMvcTest
public class ResponseDtoTest {
@Autowired
private MockMvc mvc;
@Test
public void HelloReturnTest(){
String name = "hello";
mvc.perform(get("/hello/dto").param("name", name)
.andExpect(status().isOk())
.andExpect(jsonPath("$.name", is(name)));
}
발생원인 >
현재 내 프로젝트에는 Controller 가 2개 존재한다.
HelloController (위 테스트 관련)
ApiController (새로추가한 파일, 위 테스트와 관련 X)
그 중 서비스가 선언된 ApiController는 위 테스트와 전혀 상관이 없다.
하지만 @WebMvcTest 어노테이션이
모든 Controller 를 빈으로 등록하는데,
ApiController 내의 선언된 Service 가 Bean 으로 등록되지 않으면서
해당 컨트롤러 bean을 등록하는 과정에서 오류가 발생했다.
>>해결방법
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HelloController.class) /* 1번 */
public class ResponseDtoTest {
@Autowired
private MockMvc mvc;
@MockBean /* 2번 */
ApiService apiService;
@Test
public void HelloReturnTest(){
String name = "hello";
mvc.perform(get("/hello/dto").param("name", name)
.andExpect(status().isOk())
.andExpect(jsonPath("$.name", is(name)));
}
1. @WebMvcTest(controllers = HelloController.class) 명시해주기
@WebMvcTest() 에 명시된 Controller만 빈으로 등록한다!
따라서 ApiController Bean을 등록하지않으므로
컨트롤러 내의 Service Bean을 찾을일이 발생하지않는다.
2. @MockBean 으로 가짜 Service빈 등록해주기
둘 중 하나의 방식으로 처리해주면 테스트가 정상적으로 통과되는것을 확인 할 수 있다.
'Spring' 카테고리의 다른 글
[Spring] IoC , DI 란? (0) | 2024.02.02 |
---|---|
[JAVA/Spring] 객체 지향 프로그래밍 (0) | 2024.01.30 |