반응형
Spring Unit Test에서 컨트롤러 테스트와 Rest Docs 결합 시, 빌드 시간이 오래 걸리는 문제점에 대한 해결 방안 작성
현재 개발 상황
- 각각의 테스트 클래스에서 @WebMvcTest 사용 => 테스트마다 Spring Context를 다시 띄우게 된다.
- 이 문제점을 해결하기 위해 팩토리 패턴으로 하나의 추상 클래스에서 다음과 같이 작성하여 빌드 시간 단축
현재 구조의 문제점
- @MockBean은 @SpyBean과 함께 Mockito가 아닌, Spring-test에서 제공되는 어노테이션이다
- @MockBean을 사용하는 테스트 클래스마다 Spring Context가 새로 띄워진다.
- @MockBean을 사용하는 테스트 클래스가 많아지는만큼 빌드 속도가 느려지게 된다.
컨트롤러 테스트에서 Spring Context가 필요할까?
- 단순하게 '컨트롤러'만 테스트를한다면, 따로 요청 테스트가 없다면 필요하다고 생각한다.
- 하지만, 요청 테스트를 통해 테스트 상황을 격리 시키고 있고
- 컨트롤러 테스트와 Rest Docs를 같은 테스트 레이어에서 관리해주고 있기 때문에
- 스프링 컨텍스트가 다시 띄워지는 시간 + 문서가 만들어지는 시간(이게 생각 이상으로 걸린다)에 대해 고려해야함을 느꼈다.
컨트롤러 테스트에서 Spring Context 제거
- 기존 @WebMvcTest를 제거한다.
- Spring Context를 사용하지 않기 때문에 @MockBean / @SpyBean으로 사용하던 객체들을 @Mock /@Spy로 교체한다.
- 개인적으로 @Spy를 사용하여 개발을 많이 하는데, 그 이유는 @Mock의 경우 Stub을 만들어주지 않으면 해당 로직 안에 존재하는 반환 값은 모두 Null로 담기게 되어 NPE가 발생하게 되기 때문이다.
- 그리고, 테스트가 실행하기 전 Rest Docs관련 MockMVc 객체를 만들어 주는 작업을 위해 Controller 객체를 POJO 기반으로 작성하여 상위의 serUp 함수로 보내준다.
반응형
LIST
'Spring Framework > spring' 카테고리의 다른 글
[SpringBoot] SpringBoot는 어떻게 실행될까? (0) | 2024.12.08 |
---|---|
MSA 환경에서 Kotlin + Spring Rest Docs + Swagger UI 적용 (0) | 2023.09.14 |
@RequestBody와 @ModelAttribute (0) | 2020.04.29 |
스프링 tiles(타일즈) 설정하기 (0) | 2019.08.12 |
스프링 MVC 설정으로 게시판 만들기 Part_2 (0) | 2019.08.09 |