728x90
테스트코드를 작성하고 있는데 이 에러가 떴다.

어떤 작업중이었냐면..
클래스 위에 붙였던 @Transactional 어노테이션을 떼고 메서드쪽에 옮겨 붙이면서
테스트코드에 어떤것은 @Transactional을 붙여야하고 어떤것은 붙이면 안되는지 시험해보면서
일단 작성,수정,삭제 부분에는 @Transactional을 붙이고, 조회부분에는 다 떼고 테스트를 돌려보았다.
(작성, 수정, 삭제 부분에 트랜잭션을 붙인 이유는 저 세개는 중간에 테스트가 실패했을때, DB에 적용되기 때문에 롤백하는 기능이 꼭 필요하다고 판단했다.)
그랬더니 저 에러가 뜸.
번역을 돌려보니

이전에는 트랜잭셔널을 붙였었는데 지금은 안붙이니까 난 에러같다.
트랜잭셔널을 붙였을 때 em.persist(admin1); 로 엔티티매니저로 1차캐시에 객체를 올려줬는데
트랜잭셔널이 없으니까 엔티티매니저를 쓸 수 없다.
그럼 어떻게 해줘야하지...??
@Test
@DisplayName("추천코스 게시글 단건조회")
void oneSelectRecommendCourseBoard() {
//given
//작성자 생성
User admin1 = User.adminBuilder()
.email("admin11@naver.com")
.nickName("테스트어드민1")
.password("asdf12!@")
.build();
em.persist(admin1);
//이미지 리스트 생성
List imageList = List.of("https://cdn.mhns.co.kr/news/photo/201910/313897_420232_1924.jpg");
//게시글 Dto 생성
RecommendRequestDto recommendRequestDto = RecommendRequestDto.builder()
.score(5)
.title("테스트코드 제목1")
.season("가을")
.region("경상북도")
.altitude(800)
.contents("테스트코드 컨텐츠입니다.")
.imgList(imageList)
.build();
//when
//글작성
Long boardId = recommendCourseBoardService.creatRecommendCourseBoard(recommendRequestDto, admin1.getId());
Long boardId2 = recommendCourseBoardService.creatRecommendCourseBoard(recommendRequestDto, admin1.getId());
RecommendDetailResponseDto recommendDetailResponseDto = recommendCourseBoardService.oneSelectRecommendCourseBoard(boardId, admin1.getNickName());
//then
assertThat(recommendDetailResponseDto.getRegion()).isEqualTo("경상북도");
assertThat(recommendDetailResponseDto.getScore()).isEqualTo(5);
assertThat(recommendDetailResponseDto.getSeason()).isEqualTo("가을");
}
일단 em.persist(admin1); 코드를 다 지워줘봤다.
단건 조회하는데 디비에서 불러와야지 글작성을 하는게 맞나..? 싶은 생각이 들었다. 기껏 db적용 되지 말라고 작성 수정 부분에는 트랜잭셔널 달아놓고 여기서 트랜잭셔널을 떼놓고 글작성을 한다...?? 매우 잘못된 코드라는 생각이 들었다.
수정해야지...
그런데 테스트 코드를 작성할때도 한 메서드에는 한가지 기능만 들어있어야 하나..?
@Test
@DisplayName("추천코스 게시글 단건조회")
void oneSelectRecommendCourseBoard() {
//given
Long boardId = 30L;
User user1 = userRepository.findById(4L).orElseThrow();
//when
RecommendDetailResponseDto recommendDetailResponseDto = recommendCourseBoardService.oneSelectRecommendCourseBoard(boardId, user1.getNickName());
//then
assertThat(recommendDetailResponseDto.getRegion()).isEqualTo("제주도 서귀포시 토평동 산15-1");
assertThat(recommendDetailResponseDto.getScore()).isEqualTo(3);
assertThat(recommendDetailResponseDto.getSeason()).isEqualTo("겨울");
}
코드 수정 해줬더니 잘 돌아갔다.
나머지도 이런식으로 수정해줘야겠다.
