-
Service Layer의 단위테스트 작성 : (1) Mockito ②Spring 2022. 2. 3. 16:19
https://dodop-blog.tistory.com/285
이제 우리는 의존 관계에서 독립적으로 ServiceLayer계층을 테스트 진행했다.
하지만 Mock객체는 생성비용이 많이 드는데 그 이유는 @MockBean 의 경우에 컨텍스트를 새로 만들기 때문 이다.
Application Context
만약 RepositoryLayer 테스트는 @DataJpaTest로, ServiceLayer는 @SpringBootTest로 진행한다고 하면 어플리케이션 컨텍스트가 2개 만들어진다. 이는 @DataJpaTest는 해당 테스트에 필요한 필수 Bean만 Context에 로드 하지만 @SpringBootTest는 테스트 수행시 모든 Bean을 로드 하게 되므로 두 테스트 어노테이션의 Configuration이 다르기 때문에 발생한다.
@MockBean의 어노테이션이 붙는 경우 스프링부트가 이전의 컨텍스트에서 캐시하지 못하므로, 객체의 갯수 및 종류 또는 @import에 따라서도 다시 로드하여 컨텍스트를 새로 만들어 내기 때문에 비용이 매우 크다.
해결방안 ①
@RunWith(SpringRunner.class) @SpringBootTest public class MockBeans { @MockBean protected ActivityRepository activityRepository; @MockBean protected UserRepository userRepository; @MockBean protected ProductRepository productRepository; @MockBean protected ReviewRepository reviewRepository; }
@RunWith(SpringRunner.class) @ExtendWith(MockitoExtension.class) @SpringBootTest @Transactional class ReviewServiceTest extends MockBeans { //사용할 테스트에서 MockBean 상속 @InjectMocks private ReviewService reviewService; //... }
Mock객체 비용을 줄이기 위해서 각각 테스트마다 생성되어 발생된 중복 Mock객체를 없애도록 하자. MockBean어노테이션이 붙은 Mock객체만들 모두 모아놓은 MockBeans 클래스를 만들고 Mock객체가 필요한 곳에서 이를 상속받아 사용하도록 하자. 이것이 가능한 이유는 @SpringBootTest에서는 테스트 실행 시점에 모든 Bean을 로드하기 때문이다.
해결방안 ②
@RunWith(SpringRunner.class) @ExtendWith(MockitoExtension.class) @SpringBootTest @Transactional class ReviewServiceTest extends MockBeans { //사용할 테스트에서 MockBean 상속 @Autowired private ReviewService reviewService; @MockInBean(ReviewService.class) //... }
또는 스프링부트 2.2버전 이후부터는 @MockBean 어노테이션 대신 @MockInBean 어노테이션을 이용하면 컨텍스트를 다시 로드하지 않도록 하고(재설정하지 않음) 컨텍스트를 깨끗하게 유지 할 수 있다.
( 참고한 사이트 ❤️🔥)
https://stackoverflow.com/questions/45591160/use-one-spring-boot-context-through-all-springboottests
'Spring' 카테고리의 다른 글
테스트를 위한 Mock과 그 외의 Test Double (0) 2022.02.03 Service Layer의 단위테스트 작성 : (2) Fake 객체 (0) 2022.02.03 Service Layer의 단위테스트 작성 : (1) Mockito ① (0) 2022.01.28 예외처리전략 ( ExceptionHandler ) 2 (0) 2022.01.13 JPA 엔티티에 생성 시점, 수정 시점 Timestamp 추가하기 ( + Auditing) (0) 2022.01.13