Server/Spring

SpringBoot - @SpringBootTest vs @WebMvcTest

JaeHoney 2022. 5. 30. 12:38

백기선님의 강의 영상을 보고 Mvc 통합테스트를 하는 방법을 익혔다. 하지만 현업에서 그렇게 했을 때 생기는 문제점을 피드백 받았고, 컨트롤러를 테스트 하는 두 가지 방법이 있음을 알게 되었다.

예제 코드

아래의 예제를 보자.

 

[TestController]

@RestController
@RequiredArgsConstructor
public class TestController {

    private TestService testService;

    @GetMapping("/hello")
    public String hello() {
        return "Controller : " + testService.hello();
    }
}

[TestService]

@Service
public class TestService {
    public String hello() {
        return "hello";
    }
}

이제 GET /hello로 요청을 보내면 "Controller : hello" 라는 문자열을 반환한다.

@SpringBootTest + @AutoConfigureMovcMvc

@AutoConfigureMockMvc
@SpringBootTest
@ActiveProfiles("test")
public class TestControllerTest {
    @Autowired
    private MockMvc mockMvc;
    
    public void hello() throws Exception {
        mockMvc.perform(get("/mailboxes"))
                .andExpect(status().isOk())
                .andExpect(content().string("\"Controller : hello\""));
    }

}

특징

  • 프로젝트 내부에 있는 스프링 빈을 모두 등록한다. (테스트가 느리다)
  • 실제 운영 환경에서 사용되는 클래스들을 통합해서 테스트한다.
    • 실제 환경과 가장 유사하게 테스트가 가능하다.
    • Service 메서드의 스펙이 변경되어도 Mocking 값을 수정하지 않아도 된다. (변경에 자유롭다)
    • 테스트 단위가 커서 디버깅이 까다롭다.

@WebMvcTest + MockBean

@WebMvcTest(TestController.class)
public class TestControllerTest {
    @Autowired
    private MockMvc mockMvc;
    
    @MockBean
    private TestService testService;
    
    public void hello() throws Exception {
        given(testService.hello()).willReturn("hello"));
        
        mockMvc.perform(get("/mailboxes"))
                .andExpect(status().isOk())
                .andExpect(content().string("\"Controller : hello\""));
    }

}

특징

  • 컨트롤러의 역할만을 테스트한다.
  • Web Layer에 해당하는 빈만 빠르게 생성한다.
    • Security, Filter, Interceptor, Request/Response Handling, Controller 등
    • @Component를 등록하지 않으므로 필요한 빈을 직접 채워줘야 한다.
    • 테스트가 훨씬 빠르다.
  • 통합테스트에서 진행이 어려운 경우를 Mock으로 테스트할 수 있다.
  • Mock 객체를 사용하므로 실제 동작과 차이가 있다.
  • Mocking 메서드의 변경이 일어나면 수정해줘야 한다.

 


Reference