inflearn logo
강의

Course

Instructor

Real-world! Developing a library management application with Kotlin and Spring Boot (Refactoring a Java project)

Lesson 9. Writing Book-Related Functional Tests

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

305

Ares

3 asked

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 객체가 없었을것 같아요. 뭔가 제대로 확인 할 방법은 없어서 그렇게 유추만 하고 있는데, 제가 유추한 내용이 맞을까요?...

 

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

java spring kotlin spring-boot 리팩토링

Answer 1

1

lannstark

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

제가 확인한 내용을 말씀드려보면, 현재 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에 있는 데이터를 실제로 가져와 확인하기 때문에 테스트가 통과하시게 될겁니다!!! 👍

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

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

0

68

2

실행이 안되네요

0

65

2

프론트 영역 보는법

0

51

2

companion object

0

78

2

Custom 레프직토리 형식

0

57

2

Querydsl 도입

0

67

2

fetch join DISTINCT 중복제거

1

83

2

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

0

85

3

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

1

177

2

테스트를 위한 코드

1

105

2

프로젝트 실행 에러

0

151

2

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

1

102

1

enum질문

1

86

1

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

0

136

2

테스트 fixture

1

210

2

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

0

140

1

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

0

140

1

13강 User Kotlin 변환중

2

169

3

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

2

174

1

-

0

141

2

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

0

312

3

junit import 불가

0

271

3

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

1

218

1

hibernate가 select를 두번 하는 이유

0

240

1