잉?

[SpringBoot] 단위 테스트를 위한 Mockito? 그게 뭔데? 본문

자바(Java)/스프링부트(SpringBoot)

[SpringBoot] 단위 테스트를 위한 Mockito? 그게 뭔데?

Jye_647 2023. 7. 26. 22:22

Mockito란?

단위 테스트를 위한 프레임워크이다.

가짜 객체인 Mock을 생성해 주고 관리하고 검증할 수 있도록 지원해 주는 프레임워크이다.

service의 update메서드를 테스트하기 위해서는 service 객체를 생성할 때 필요한 repository를 전달해 줘야 한다.

하지만 이러한 인터페이스들을 어떻게 전달해야하는지 막막할 때 Mockito를 사용한다고 보면 된다.

 

Mock object(가짜 객체)?

개발한 프로그램을 테스트할 때 테스트를 수행할 모듈과 연결되는 다른 모듈을 흉내 내는 가짜 모듈을 생성하는 객체이다. 분리되기 어려운 클래스들을 가짜객체를 통해 분리한다.

 

여기서 분리되기 어려운 클래스들의 예시로는 Controller, Service, Repository가 있다.

Controller 클래스를 테스트하기 위해서는 Controller, Service, Repository를 

Service 클래스를 테스트하기 위해서는 Service, Repository를

Repository 클래스를 테스트하기 위해서는 Repository를 테스트해야 한다.

 

뒤에 딸려오는 클래스를 가짜객체(Mock Object)를 통해 분리해 준다. 

Service 클래스를 테스트하기 위해 MockRepository를 만들어 주는 것이다.

겉만 같은 가짜 repository인 것이다. 

@ExtendWith(MockitoExtension.class) // @Mock 사용을 위해 설정합니다.
class ProductServiceTest {

    @Mock // 이렇게 @Mock을 사용하여 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());
    }

 

Comments