[테스트] 비즈니스 로직(Service) 테스트 할 때 void로 반환값이 없는 메소드일 경우 테스트

손경이·2024년 2월 12일
2

2024.02.12
[테킷 백엔드] 프로젝트 - alcoholfriday
환경 - 스프링부트 3.2.1, 자바 JDK17
작업 - 장바구니에 상품 삭제 테스트


💡 비즈니스 로직(Service) 테스트 할 때 void로 반환값이 없는 메소드일 경우 테스트

- doNothing()

  • void를 반환하는 메서드의 경우 'thenReturn()' 대신 'doNoting()'을 사용할 수 있다.
  • Mockito의 'doNothing()'메소드를 사용하여 모의 객체의 메서드가 아무런 일도 하지 않도록 설정할 수 있다.
doNothing().when(cartDetailRepository).deleteByIdAndCart(cartRequest.getItemId(), cart);
  • cartDetailRepository.deleteByIdAndCart() 메서드가 아무런 일도 하지 않도록 설정

- verify()

  • Mockito에서는 void메소드의 '호출 여부를 검증'하기 위해 'verify()'메소드를 사용한다. 그리고 호출된 횟수도 확인할 수 있다.
  • 호출된 횟수를 확인할 떄는 두 번째 매개변수로 호출 횟수 지정 가능하다.
  • times(1)는 한 번 호출했는지 확인
verify(cartDetailRepository, times(1)).deleteByIdAndCart(cartRequest.getItemId(), cart);
  • cartDetailRepository.deleteByIdAndCart() 메서드가 호출되었는지를 확인

- 전체 코드

@Test
    @DisplayName("장바구니에서 상품 한 개 이상 삭제")
    void deleteCartListTest() {
        // given
        // 상품을 장바구니에 저장
        CartDetail cartDetail = CartDetail.builder()
                .cart(cart)
                .item(item)
                .quantity(quantityCart)
                .build();
        CartDetail cartDetail2 = CartDetail.builder()
                .cart(cart)
                .item(item2)
                .quantity(quantityCart2)
                .build();
        cartDetailRepository.save(cartDetail);
        cartDetailRepository.save(cartDetail2);

        // cartRepository.findFirstByMember(member)
        when(cartRepository.findFirstByMember(member)).thenReturn(getOneCart());
        // cartDetailRepository.deleteByIdAndCart(cartRequest.getItemId(), cart)
        List<DeleteCartRequest> cartRequests = new ArrayList<>();
        DeleteCartRequest cartRequest = DeleteCartRequest.builder()
                .itemId(itemId1)
                .build();
        DeleteCartRequest cartRequest2 = DeleteCartRequest.builder()
                .itemId(itemId2)
                .build();
        cartRequests.add(cartRequest);
        cartRequests.add(cartRequest2);

        doNothing().when(cartDetailRepository).deleteByIdAndCart(cartRequest.getItemId(), cart);
        doNothing().when(cartDetailRepository).deleteByIdAndCart(cartRequest2.getItemId(), cart);

        // when
        cartService.deleteCartList(cartRequests, member);

        // then
        // 메서드 호출 여부를 검증
        verify(cartDetailRepository, times(1)).deleteByIdAndCart(cartRequest.getItemId(), cart);
        verify(cartDetailRepository, times(1)).deleteByIdAndCart(cartRequest2.getItemId(), cart);
    }

참고

ChatGPT

0개의 댓글