⏰ 2024. 06. 21 금
✔ 스프링 이론 강의를 듣고 정리하면서 작성했습니다.
Mockito
만약 Service 클래스를 단위 테스트 하려면, Service 객체에 의존성 주입되어 있는 Repository를 주입해 줘야한다.
이상적으로는 각각의 단위 테스트는 의존성에서 서로 분리되어야 한다.
이를 위해 가짜 객체(Mock Object)를 생성하는 Mockito
를 사용해 테스트할 수 있다.
Spring에서는 3계층 레이어를 통해 Controller, Service, Repository로 나눠 작동하기 때문에 이 각각의 클래스를 단위 테스트가 불가능하다.
Controller 클래스 테스트 -> 테스트 범위 : Controller, Service, Repository
Service 클래스 테스트 -> 테스트 범위 : Service, Repository
Repository 클래스 테스트 -> 테스트 범위 : Repository
위 같은 의존성을 분리하기 위해서 가짜 객체(Mock Object)를 통해 분리할 수 있다.
가짜 객체를 통해 Repository 인터페이스와 분리한다.
MockRepository
는 실제 객체와 동일한 클래스명, 함수명을 가진 겉만 같은 객체이고, 실제 DB 작업은 수행되지 않기 때문에 실제 필요한 결과 값을 return 하도록 해야한다.
자바에서 단위 테스트를 위한 가짜 객체를 생성하고 관리하는데 사용되는 프레임워크이다.
단위 테스트의 의존성 주입이 필요한 부분에 활용됩니다.
테스트의 안정성과 예측 가능성을 높이며, 개발자가 코드를 더욱 견고하게 작성할 수 있도록 도와준다.
@ExtendWith(MockitoExtension.class) // @Mock 사용을 위해 설정합니다.
class ProductServiceTest {
@Mock
ProductRepository productRepository;
@Mock
FolderRepository folderRepository;
@Mock
ProductFolderRepository productFolderRepository;
@Test
@DisplayName("관심 상품 희망가 - 최저가 이상으로 변경")
void test1() {
// given
Long productId = 100L;
int myprice = ProductService.MIN_MY_PRICE + 3_000_000;
ProductMypriceRequestDto requestMyPriceDto = new ProductMypriceRequestDto();
requestMyPriceDto.setMyprice(myprice);
User user = new User();
ProductRequestDto requestProductDto = new ProductRequestDto(
"Apple <b>맥북</b> <b>프로</b> 16형 2021년 <b>M1</b> Max 10코어 실버 (MK1H3KH/A) ",
"https://shopping-phinf.pstatic.net/main_2941337/29413376619.20220705152340.jpg",
"https://search.shopping.naver.com/gate.nhn?id=29413376619",
3515000
);
Product product = new Product(requestProductDto, user);
ProductService productService = new ProductService(productRepository, folderRepository, productFolderRepository);
given(productRepository.findById(productId)).willReturn(Optional.of(product));
// when
ProductResponseDto result = productService.updateProduct(productId, requestMyPriceDto);
// then
assertEquals(myprice, result.getMyprice());
}
}
클래스에 @ExtendWith(MockitoExtension.class)
속성을 선언하면 Mokito 사용이 가능하다.
의존성을 주입 받아야 하는 클래스나 인터페이스에 @Mock
애너테이션을 선언한다.
given(productRepository.findById(productId)).willReturn(Optional.of(product))
을 통해 가짜 객체로 동작하는 부분을 given
메서드를 통해 필요한 return
값을 선언한다.