#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개인 것이 당연하다.
'Spring' 카테고리의 다른 글
STOMP로 소켓 방식 채팅 구현 + Rate Limiter, Token Bucket으로 API 처리율 제한하기 (0) | 2024.06.21 |
---|---|
Redis Sorted Sets으로 인기 검색어 구현하기 (0) | 2024.04.09 |
리뷰 좋아요 조회 쿼리 N + 1 문제 해결하기 (0) | 2024.04.05 |
QueryDSL 동적 정렬 쿼리 OrderSpecifier 구현하기 (0) | 2024.03.28 |
Spring Security 없이 소셜 로그인 구현하기 (0) | 2024.03.17 |