Validation Test Code 작성 중 발생한 Error (@WebMvcTest, @SpringBootTest)

엉금엉금·2022년 7월 19일
0

오늘 만난 문제

목록 보기
16/24
@WebMvcTest
public class ValidationTest {

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private ObjectMapper objectMapper;

    @Test
    @DisplayName("음식점 등록 이름 누락 시 400Error을 전달한다")
    void missRestaurantNameTest() throws Exception {
        // given
        RestaurantSaveRequestDto request = RestaurantSaveRequestDto.builder()
                .name("")
                .minOrderPrice(4900)
                .deliveryFee(5900)
                .build();

        String json = objectMapper.writeValueAsString(request);

        //expected
        mockMvc.perform(post("/api/v1/restaurants")
                        .contentType(APPLICATION_JSON)
                        .content(json)
                )
                .andExpect(status().isBadRequest())
                .andDo(MockMvcResultHandlers.print());
    }
}

Validation 코드 작성하고 실행 하자마자 에러 발생!
@WebMvcTest 어노테이션을 이용하여 음식점을 등록하는 Controller의 메소드만들 테스트 하려했다.

출력된 Error Stack trace (간략하게 작성하겠다;;)

java.lang.IllegalStateException: Failed to load ApplicationContext
...
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException : Error creating bean with name 'orderControllerV1'
...
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException : No qualifying bean of type '~~.service.OrderService'
...

처음에 에러 메시지를 보고 들었던 생각은... 내가 현재 사용하지 않는 Controller의 Bean을 찾지 못해 발생하는 에러인 것은 알겠는데... 아니 왜 내가 테스트 하지 않는 Controller의 Bean을 왜 찾는지 이해되지 않았다.

@WebMvcTest VS @AutoConfigureMockMvc, @SpringBootTest

@WebMvcTest

  • 간단한 웹 MVC Layer의 테스트만 수행할 때 사용한다.
  • 그런데 현재 테스트하려는 곳은 내가 Controller만을 테스트하려 해도 Service, Repository Layer를 만들어 놓고 로직을 수행한다 즉, 애플리케이션의 전반적인 테스트를 수행한다. 따라서 @SpringBootTest 어노테이션을 이용해야 한다.

@SpringBootTest

  • 애플리케이션 전반적인 테스트를 수행하는데 한 가지 문제점이 있다. MockMvc에 대한 Bean 주입이 되지 않는다.
  • @AutoConfigureMockMvc 어노테이션을 클래스 레벨에 작성하면 MockMvc에 대한 Bean이 주입된다.
  • 이 두가지 어노테이션을 통해 전체 애플리케이션 컨텍스트를 불러와 테스트를 진행하게 된다.
profile
step by step

0개의 댓글