[테스트 에러] org.mockito.exceptions.misusing.UnnecessaryStubbingException: Unnecessary stubbings detected.

손경이·2024년 2월 11일
1

에러모음

목록 보기
16/20

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

❗ 에러 문구

  • org.mockito.exceptions.misusing.UnnecessaryStubbingException:
    Unnecessary stubbings detected.
    Clean & maintainable test code requires zero unnecessary code.
    Following stubbings are unnecessary (click to navigate to relevant line of code):
    1. -> at com.drunkenlion.alcoholfriday.domain.cart.application.CartServiceTest.addCartListTest(CartServiceTest.java:174)
      Please remove unnecessary stubbings or use 'lenient' strictness. More info: javadoc for UnnecessaryStubbingException class.

한글 해석
org.mockito.Exceptions.misusing.UnnecessaryStubbingException:
불필요한 스터빙이 감지되었습니다.
깨끗하고 유지 관리 가능한 테스트 코드에는 불필요한 코드가 필요하지 않습니다.
다음 스텁은 필요하지 않습니다(관련 코드 줄로 이동하려면 클릭하세요).
1. -> com.drunkenlion.alcoholfriday.domain.cart.application.CartServiceTest.addCartListTest(CartServiceTest.java:174)에서
불필요한 스터빙을 제거하거나 '관대한' 엄격함을 사용하세요. 추가 정보: UnnecessaryStubbingException 클래스에 대한 javadoc.

  • 에러난 코드
@Test
    @DisplayName("장바구니에 한 개 이상 상품 담았을 경우")
    void addCartList() {
        // given
        List<AddCartRequest> cartDetails = new ArrayList<>();
        AddCartRequest cartRequest1 = AddCartRequest.builder()
                .itemId(itemId1)
                .quantity(quantityCart)
                .build();
        AddCartRequest cartRequest2 = AddCartRequest.builder()
                .itemId(itemId2)
                .quantity(quantityCart2)
                .build();

        cartDetails.add(cartRequest1);
        cartDetails.add(cartRequest2);

        when(this.itemRepository.findById(cartRequest1.getItemId())).thenReturn(this.getOneItem());
        when(this.itemRepository.findById(cartRequest2.getItemId())).thenReturn(this.getOneItem2());

        CartDetail cartDetail1 = CartDetail.builder()
                .cart(cart)
                .item(item)
                .quantity(cartRequest1.getQuantity())
                .build();
        CartDetail cartDetail2 = CartDetail.builder()
                .cart(cart)
                .item(item)
                .quantity(cartRequest2.getQuantity())
                .build();

        when(this.cartDetailRepository.save(any(CartDetail.class))).thenReturn(cartDetail1);
        when(this.cartDetailRepository.save(any(CartDetail.class))).thenReturn(cartDetail2);

        // when
        List<CartDetailResponse> cartDetailResponses = this.cartService.addCartList(cartDetails, member);

        // then
        assertThat(cartDetailResponses.get(0).getItem().getName()).isEqualTo(itemName);
        assertThat(cartDetailResponses.get(0).getQuantity()).isEqualTo(cartRequest1.getQuantity());
        assertThat(cartDetailResponses.get(1).getItem().getName()).isEqualTo(itemName2);
        assertThat(cartDetailResponses.get(1).getQuantity()).isEqualTo(cartRequest2.getQuantity());
    }

📸 에러 캡쳐


🔎 에러 이유 및 해결 (ChatGPT 도움)

  • 에러가 발생한 이유
    • when(this.cartDetailRepository.save(any(CartDetail.class))).thenReturn(cartDetail1);
      when(this.cartDetailRepository.save(any(CartDetail.class))).thenReturn(cartDetail2);
    • 문제가 되는 부분은 when() 메소드에서 thenReturn() 메소드를 두 번 호출하는 부분입니다. Mockito에서는 동일한 메소드에 대해 여러 번 호출한 경우 마지막 호출만 유효하게 됩니다. 따라서 두 번째 thenReturn() 호출은 첫 번째 호출을 덮어쓰게 됩니다.
  • 해결한 이유
    • 문제를 해결하려면 첫 번째 thenReturn() 호출에 이어서 다음에 호출할 때 thenReturn()을 다시 호출하는 대신 thenReturn() 메소드를 체인 형태로 이어가면 됩니다.
    • when(this.cartDetailRepository.save(any(CartDetail.class))).thenReturn(cartDetail1).thenReturn(cartDetail2);
    • 이렇게 하면 첫 번째 호출에 대해 cartDetail1을 반환하고, 두 번째 호출에 대해 cartDetail2를 반환합니다.

0개의 댓글