inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

returnBookTest 질문드립니다.

537

돌아온무리뉴

작성한 질문수 6

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
    }

spring-boot kotlin spring java refactoring

답변 2

2

최태현

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

 

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

 

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

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

 

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

 

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

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

1

돌아온무리뉴

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

0

최태현

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

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

안녕하세요 혹시 프론트 코드 제공받을 수 있을까요?

0

69

2

실행이 안되네요

0

68

2

프론트 영역 보는법

0

52

2

companion object

0

79

2

Custom 레프직토리 형식

0

60

2

Querydsl 도입

0

68

2

fetch join DISTINCT 중복제거

1

86

2

표준 예외와 커스텀 예외 사용 전략 질문

0

93

3

이 질문이 왜 없는지 이해가 안 되지만 문제 인식 및 해결 방법 남깁니다.

1

177

2

테스트를 위한 코드

1

106

2

프로젝트 실행 에러

0

153

2

PDF 문서에 오타가 있어서 알려드립니다.

1

102

1

enum질문

1

87

1

테스트 후 AfterEach 함수에서 나오는 쿼리

0

136

2

테스트 fixture

1

211

2

./gradlew test 실행시 인식할수 없다고 뜹니다.

0

141

1

test 코드 실행시 경고가 발생합니다.

0

143

1

13강 User Kotlin 변환중

2

171

3

'추가 - 코프링과 플러그인' 강의 7:46 allopen 관련 질문

2

174

1

-

0

141

2

4:28 build.gradle 수정 시 kotlin-reflect관련 implementation 추가 해야할까요?

0

314

3

junit import 불가

0

279

3

테스트 코드와 관련하여 질문이 있습니다.

1

219

1

hibernate가 select를 두번 하는 이유

0

240

1