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

Ares님의 프로필 이미지
Ares

작성한 질문수

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

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

9강 returnBookTest() 문의드립니다!

작성

·

268

0

안녕하세요. 9강 returnBookTest() 질문 드립니다.

저는 강의 내용을 듣기 전에 미리 제가 테스트코드를 짜보고 이후에 비교해가면서 강의를 수강하는데요. 제가 짠 코드는 실패를 해서 문의드려봅니다.

@Test
    @DisplayName("책 반납 성공")
    fun returnTest(){
        //given
        val user = User("phd",31)
        userRepository.save(user)

        val book = Book("testBook")
        bookRepository.save(book)

        val loanHistory = UserLoanHistory(user,"testBook",false)
        userLoanHistoryRepository.save(loanHistory)
        //when
        assertThat(loanHistory.isReturn).isFalse()
        bookService.returnBook(BookReturnRequest(user.name, "testBook"))
        
        //then
        assertThat(loanHistory.isReturn).isTrue()
}

저는 loanHistory 엔티티가 영속성 컨텍스트에 있기 때문에 user.userLoanHistroy 엔티티가 바뀔 때 loanHIstroy 객체의 상태 값 도 바뀔거라고 생각했는데요. 생각해보니까 각 엔티티를 save() 하는 메소드들의 트랜잭션이 각각 달라서 영속성 컨텍스트에 loanHistroy 객체가 없었을것 같아요. 뭔가 제대로 확인 할 방법은 없어서 그렇게 유추만 하고 있는데, 제가 유추한 내용이 맞을까요?...

 

강의 언제나 잘 보고 있습니다. 감사합니다!

답변 1

1

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

안녕하세요, 좋은 질문 감사드립니다!! 🙏 먼저 테스트 코드를 작성해보시고 유추해보시는게 정말 좋네요! 👍

제가 확인한 내용을 말씀드려보면, 현재 loanHistory 불러오고 확인하는 시점의 문제입니다!

@Test
@DisplayName("책 반납 성공")
fun returnTest(){
    //given
    val user = User("phd",31)
    userRepository.save(user)

    val book = Book("testBook")
    bookRepository.save(book)

    val loanHistory = UserLoanHistory(user,"testBook",false) <--- (1)
    userLoanHistoryRepository.save(loanHistory) 

    //when
    assertThat(loanHistory.isReturn).isFalse() <--- (2)
    bookService.returnBook(BookReturnRequest(user.name, "testBook"))
        
    //then
    assertThat(loanHistory.isReturn).isTrue() <--- (3)
}

(1)번 코드를 보시면, loanHistory 는 저희가 만든 객체입니다! DB에서 데이터를 가져오거나 하지 않았고, 그냥 객체를 만든거죠! 때문에 (2)번은 당연히 성공하게 됩니다!

자 그리고 이제 bookService.returnBook() 이 호출되고요~~~ 문제의 (3)번 코드로 가게 되는데요!

여기서도 loanHistorybookService.returnBook() 으로 인해 업데이트된 데이터가 반영되지 않은 저희가 (1)번에서 만든 객체입니다. 때문에 여전히 isReturn이 false인거!

여기서 변경을 최소화하시면서 테스트를 성공시키고 싶으시다면, DB에서 데이터를 가져와주기만 하면 됩니다!

@Test
@DisplayName("책 반납 성공")
fun returnTest(){
    //given
    val user = User("phd",31)
    userRepository.save(user)

    val book = Book("testBook")
    bookRepository.save(book)

    val loanHistory = UserLoanHistory(user,"testBook",false)
    userLoanHistoryRepository.save(loanHistory) 

    //when
    assertThat(loanHistory.isReturn).isFalse()
    bookService.returnBook(BookReturnRequest(user.name, "testBook"))
        
    //then - 변경된 부분!!!!
    val changedHistory = userLoanHistoryRepository.findAll()[0]
    assertThat(changedHistory.isReturn).isTrue()
}

이렇게 되면 DB에 있는 데이터를 실제로 가져와 확인하기 때문에 테스트가 통과하시게 될겁니다!!! 👍

감사합니다!!! 또 질문 있으시면 편하게 올려주세요~!! 🙏🙏

Ares님의 프로필 이미지
Ares

작성한 질문수

질문하기