본문 바로가기
Spring

[Spring] could not initialize proxy [...] - no Session 오류

by heyh0 2024. 4. 2.

#1. Event

    @DisplayName("사용자가 리뷰 좋아요를 누른다.")
    @Test
    void likeReview() {
        //given
        User user = userRepository.save(createUser("1"));
        Book book = bookRepository.save(createBook());
        Review review = reviewRepository.save(createReview(user, book));

        //when
        reviewLikeService.createReviewLike(user.getId(), review.getId());

        //then
        List<ReviewLike> reviewLike = reviewLikeRepository.findAll();

        assertThat(reviewLike).hasSize(1)
                .extracting("userId", "reviewId") // 문제가 되는 부분
                .contains(
                        Tuple.tuple(user.getId(), review.getId())
                );
    }

 

일단 review_like는 user와 review의 중간 연결 테이블이다. 

즉, 다대다 관계를 풀기 위한 엔티티이다.

나는 테스트에서 review_like의 값을 검증하려고 테스트 코드를 작성하다가 해당 오류가 발생했다.

 

다시 생각하면 당연한 오류였다.

review_like 값을 가져오면 review와 user도 같이 넘어온다.

하지만 연관관계 속성 값이 지연 로딩이기 프록시 객체로 넘어와서 직접 읽으면 에러가 발생한다.

#2. Solution

    @DisplayName("사용자가 리뷰 좋아요를 누른다.")
    @Test
    void likeReview() {
        //given
        User user = userRepository.save(createUser("1"));
        Book book = bookRepository.save(createBook());
        Review review = reviewRepository.save(createReview(user, book));

        //when
        reviewLikeService.createReviewLike(user.getId(), review.getId());

        //then
        List<ReviewLike> reviewLike = reviewLikeRepository.findAll();

        assertThat(reviewLike).hasSize(1);
        assertThat(reviewLike.get(0).getUser().getId()).isEqualTo(user.getId());
        assertThat(reviewLike.get(0).getReview().getId()).isEqualTo(review.getId());
    }

 

수정한 코드를 보면 직접 값을 꺼내서 검증했다.

각 단위 테스트마다 clear 작업을 하고 수행하기 때문에 해당 테스트의 데이터는 1개인 것이 당연하다.