인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

돌아온무리뉴님의 프로필 이미지
돌아온무리뉴

작성한 질문수

실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)

9강. 책 관련 기능 테스트 작성하기

returnBookTest 질문드립니다.

작성

·

425

1

안녕하세요 강사님! 테스트 코드를 작성하던 중 문제가 발생하여 문의드립니다.

returnBookTest 상에서 UserLoanHistory가 DB에만 저장되고(90번째 줄), savedUser.userLoanHistories에는 추가가 안되어 user.returnBook을 호출하는 과정에서 NoSuchElementException이 발생하는 것 같습니다.

    @Test
    fun returnBookTest() {
        // given
        bookRepository.save(Book("이상한 나라의 엘리스"))
        val savedUser = userRepository.save(User("김", null))
        userLoanHistoryRepository.save(UserLoanHistory(savedUser, "이상한 나라의 엘리스", false)) // 생성한 UserLoanHistory 객체가 DB에만 저장됨
        val request = BookReturnRequest("김", "이상한 나라의 엘리스")

        // when
        bookService.returnBook(request) // 최종적으로 user.returnBook 호출

        // then
        val results = userLoanHistoryRepository.findAll()
        assertThat(results).hasSize(1)
        assertThat(results[0].isReturn).isTrue
    }
public void returnBook(String bookName) {
  UserLoanHistory targetHistory = this.userLoanHistories.stream() // userLoanHistories.size() == 0
      .filter(history -> history.getBookName().equals(bookName))
      .findFirst()
      .orElseThrow(); // 여기서 예외 발생
  targetHistory.doReturn();
}

 

따라서 다음과 같이 수정해야 하지 않을까 싶은데 이 부분 확인 부탁드립니다!!

    @Test
    fun returnBookTest() {
        // given
        bookRepository.save(Book("이상한 나라의 엘리스"))
        userRepository.save(User("김", null))

        val loanRequest = BookLoanRequest("김", "이상한 나라의 엘리스")
        bookService.loanBook(loanRequest)

        val returnRequest = BookReturnRequest("김", "이상한 나라의 엘리스")

        // when
        bookService.returnBook(returnRequest)

        // then
        val results = userLoanHistoryRepository.findAll()
        assertThat(results).hasSize(1)
        assertThat(results[0].isReturn).isTrue
    }

답변 2

2

최태현님의 프로필 이미지
최태현
지식공유자

안녕하세요! 돌아온무리뉴님~!!! 크으~~ 너무너무 좋은 질문이십니다 👍👍👍

 

관련해서 보여드리고 싶은 코드와 내용이 많아, 영상을 촬영해보았는데요!

 

글로도 간단히 말씀드리자면, 혹시 테스트 코드를 실행시킬 때 @Transactional을 사용하고 있지는 않으신지 확인해보시면 좋을 것 같습니다!! (연관관계가 잘 맺어져 있다는 가정 하에요!!! ㅎㅎㅎㅎ)

말씀해주신 에러는 @Transactional을 테스트 코드에 붙일 경우 나올 수 있거든요!!!

 

보다 자세한 내용은 아래의 영상을 참조해주시면 감사드리겠습니다~!!!

 

더 궁금한 점 있으시다면 편하게 질문 남겨주세요!!!

감사합니다~ 편안한 밤 되세요!! 🙏

1

정확하게 말씀해주신 부분이 맞네요...!!! 무의식적으로 @Transactional을 쓰고 있었는데 생각보다 고민할 부분이 많았네요!! 강사님 덕분에 잘 배워갑니다 감사합니다 ㅎㅎ

최태현님의 프로필 이미지
최태현
지식공유자

아 찾으셨군요~~ 다행입니다 ㅎㅎㅎㅎ 넵넵!!! 확실히 자동으로 해주는게 많은 만큼, 고민할 부분이 많더라고요!

언제든 또 편하게 질문 주세요! 감사합니다!! 😊

돌아온무리뉴님의 프로필 이미지
돌아온무리뉴

작성한 질문수

질문하기