[테스트 에러] CartServiceTest에서 modifyCart() 따로 테스트하면 잘되는데 CartServiceTest 전체 실행을 하면 에러가 난다.

손경이·2024년 2월 21일
0

에러모음

목록 보기
17/20

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

❗ 에러 문구

  • CartServiceTest에서 modifyCart() 따로 테스트하면 잘되는데 CartServiceTest 전체 실행을 하면 에러가 난다.

📸 에러 캡쳐

  • item에 비어있는 값이 들어온다. 내가 원한것은 값이 채워진 item 객체가 들어오길 바란다.

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

  • 에러가 발생한 이유
    • 테스트 코드에 itemId 값을 하드코딩해서 넣었다.
      그러다보니 CartServiceTest 전체 검사할 때 장바구니에 상품 담기(), 장바구니 상품 삭제() 등 메서드를 실행하면서 Item 테이블에 데이터를 넣었다. 지웠다를 반복했다. 그러다보니 테이블의 Id가 증가를 하고 내가 하드코딩한 ItemId와 맞지 않았던 것이다.

  • 해결한 이유

    • itemId를 하드코딩하는 대신에 itemRepository.save()할 때 Item 객체를 받아와서 그때마다 저장되는 itemId값을 받아오는 걸로 바꿨다.
  • 전체 코드

	@BeforeEach
    @Transactional
    void beforeEach() {
    	Item item = Item.builder()
                .name("test ddaattaa")
                .price(new BigDecimal(50000))
                .info("이 상품은 테스트 상품입니다.")
                .build();
                
        Item savedItem = itemRepository.save(item);
        itemId = savedItem.getId();
    }
	@Test
    @DisplayName("장바구니 상품 수량 변경")
    @WithAccount
    void modifyCart() throws Exception {
        // when
        ResultActions resultActions = mvc
                .perform(put("/v1/carts")
                        .contentType(MediaType.APPLICATION_JSON)
                        .characterEncoding("UTF-8")
                        .content("""
                                {
                                    "itemId": "%d", // 동적으로 아이템의 ID를 사용
                                    "quantity": "5"
                                }
                                """.formatted(itemId))
                )
                .andDo(print());

        // then
        resultActions
                .andExpect(status().isOk())
                .andExpect(handler().handlerType(CartController.class))
                .andExpect(handler().methodName("modifyCart"))
                .andExpect(jsonPath("$", instanceOf(LinkedHashMap.class)))
                .andExpect(jsonPath("$.item.id", instanceOf(Number.class)))
                .andExpect(jsonPath("$.quantity", notNullValue()));
    }

참고
ChatGPT

0개의 댓글