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
'실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기' 카테고리의 다른 글
| Ch04. 요구사항 추가(책 통계, QueryDSL) - 책 통계 요구사항 추가 (0) | 2022.11.07 |
|---|---|
| Ch03. 요구사항 추가(type, 대출현황) - N+1 문제와 SQL 조인을 통한 문제 해결(fetch join) (0) | 2022.11.06 |
| Ch03. 요구사항 추가(type, 대출현황) - 도서 대출 현황 요구사항 추가 (0) | 2022.11.06 |
| Ch03. 요구사항 추가(type, 대출현황) - UserLoanHistory의 isReturn을 Enum으로 변경하기 (0) | 2022.11.05 |
| Ch03. 요구사항 추가(type, 대출현황) - Enum Class 를 활용해 type 리펙토링 하기 (0) | 2022.11.05 |