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

Ch03. 요구사항 추가(type, 대출현황) - 유저 대출 현황 - 테스트 코드 작성

webmaster 2022. 11. 6. 13:42
728x90

검증 조건 

  • 사용자가 지금까지 한 번도 책을 빌리지 않은 경우 APi 응답에 잘 포함되어 있어야 한다.
  • 사용자가 책을 빌리고 아직 반납하지 않은 경우 isReturn 값이 false로 잘 들어 있어야 한다.
  • 사용자가 책을 빌리고 반납한 경우 isReturn 값이 true로 잘 들어 있어야 한다.
  • 사용자가 책 여러 권을 빌렸는데, 반납을 한 책도 있고 하지 않은 책도 있는 경우 중첩된 리스트에 여러 권이 정상적으로 들어가 있어야 한다.

테스트 코드

@Test
@DisplayName("대출 기록이 없는 유저도 응답에 포함된다.")
fun getUserLoanHistoriesTest1() {
    //given
    userRepository.save(User("A", null))

    //when
    val result = userService.getUserLoanHistories()

    //then
    assertThat(result).hasSize(1)
    assertThat(result[0].name).isEqualTo("A")
    assertThat(result[0].books).isEmpty()
}

@Test
@DisplayName("대출 기록이 많은 유저의 응답이 정상 동작한다")
fun getUserLoanHistoriesTest2() {
    //given
    val saveUser = userRepository.save(User("A", null))
    userLoanHistoryRepository.saveAll(
        listOf(
            UserLoanHistory.fixture(saveUser, "책1", UserLoanStatus.LOANED),
            UserLoanHistory.fixture(saveUser, "책2", UserLoanStatus.LOANED),
            UserLoanHistory.fixture(saveUser, "책3", UserLoanStatus.RETURNED),
        )
    )

    //when
    val result = userService.getUserLoanHistories()

    //then
    assertThat(result).hasSize(1)
    assertThat(result[0].name).isEqualTo("A")
    assertThat(result[0].books).hasSize(3)
    assertThat(result[0].books).extracting("name").containsExactlyInAnyOrder("책1", "책2", "책3")
    assertThat(result[0].books).extracting("isReturn")
        .containsExactlyInAnyOrder(false, false, true)
}

@Test
@DisplayName("두 경우가 합쳐진 테스트")
fun getUserLoanHistoriesTest3() {
    //given
    val saveUsers = userRepository.saveAll(listOf(
        User("A", null),
        User("B", null)))
    userLoanHistoryRepository.saveAll(
        listOf(
            UserLoanHistory.fixture(saveUsers[0], "책1", UserLoanStatus.LOANED),
            UserLoanHistory.fixture(saveUsers[0], "책2", UserLoanStatus.LOANED),
            UserLoanHistory.fixture(saveUsers[0], "책3", UserLoanStatus.RETURNED),
        )
    )

    //when
    val result = userService.getUserLoanHistories()

    //then
    assertThat(result).hasSize(2)
    val userAResult = result.first{ it.name == "A"}

    assertThat(userAResult.name).isEqualTo("A")
    assertThat(userAResult.books).hasSize(3)
    assertThat(userAResult.books).extracting("name").containsExactlyInAnyOrder("책1", "책2", "책3")
    assertThat(userAResult.books).extracting("isReturn")
        .containsExactlyInAnyOrder(false, false, true)

    val userBResult = result.first { it.name == "B" }
    assertThat(userBResult.books).isEmpty()
}
  • Test 1 같은 경우 대출 기록이 없는 User도 리스트에 포함이 되는 것을 테스트한 것이다.
  • Test 2 같은 경우 대출 기록이 많은 User의 응답이 정상적으로 반환되는지 확인하는 테스트이다.
  • Test 3 같은 경우 Test 1 + Test 2이다.
    • 이 테스트 같은 경우 좋지 않다 -> 한 번에 여러 테스트를 검증하는 것에는 문제가 있다.
    • 테스트 로직이 복잡해지는 문제와, Test 1 이 문제가 발생하면 Test 2는 실행조차 되지 않으므로 좋지 않다.
728x90