[SPRING] Mockito

김승수·2024년 6월 21일
0

SPRING

목록 보기
21/27

⏰ 2024. 06. 21 금

✔ 스프링 이론 강의를 듣고 정리하면서 작성했습니다.

💡 목차

  1. Mockito 를 사용해야 하는 이유
  2. Mockito 란?
  3. Mockito 적용 예제

Mockito

  • 만약 Service 클래스를 단위 테스트 하려면, Service 객체에 의존성 주입되어 있는 Repository를 주입해 줘야한다.

  • 이상적으로는 각각의 단위 테스트는 의존성에서 서로 분리되어야 한다.

  • 이를 위해 가짜 객체(Mock Object)를 생성하는 Mockito를 사용해 테스트할 수 있다.

Mockito 를 사용해야 하는 이유

분리되기 어려운 클래스들

  • Spring에서는 3계층 레이어를 통해 Controller, Service, Repository로 나눠 작동하기 때문에 이 각각의 클래스를 단위 테스트가 불가능하다.

  • Controller 클래스 테스트 -> 테스트 범위 : Controller, Service, Repository

  • Service 클래스 테스트 -> 테스트 범위 : Service, Repository

  • Repository 클래스 테스트 -> 테스트 범위 : Repository

  • 위 같은 의존성을 분리하기 위해서 가짜 객체(Mock Object)를 통해 분리할 수 있다.

가짜객체(Mock object)를 통한 분리 방법

  • 가짜 객체를 통해 Repository 인터페이스와 분리한다.

  • MockRepository는 실제 객체와 동일한 클래스명, 함수명을 가진 겉만 같은 객체이고, 실제 DB 작업은 수행되지 않기 때문에 실제 필요한 결과 값을 return 하도록 해야한다.

Mockito 란?

  • 자바에서 단위 테스트를 위한 가짜 객체를 생성하고 관리하는데 사용되는 프레임워크이다.

  • 단위 테스트의 의존성 주입이 필요한 부분에 활용됩니다.

  • 테스트의 안정성과 예측 가능성을 높이며, 개발자가 코드를 더욱 견고하게 작성할 수 있도록 도와준다.

Mockito 적용 예제

@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 값을 선언한다.

profile
개발하는 미어캣

0개의 댓글