본문 바로가기
Spring

테스트 실행시 에러 : consider defining a bean of type in your configuration

by 겅아링 2024. 7. 22.
반응형

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

 

테스트 코드 빈 등록 에러consider defining a bean of type in your configuration

sns 프로젝트를 만드는 도중 Post기능을 추가하고 PostController와 PostService를 만들기전에 로그인과 회원가입 기능을 테스트 했던 UserTest를 다시 돌려보았다 그런데 PostService를 빈으로 등록 할 수 없

velog.io

 

 

 

 

 

@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