개념
- 특정 객체가 정상적으로 삭제되는지 확인하는 테스트
- 주의!: 서비스 테스트는 실제 DB에 영향을 주지 않으므로, 리파지토리의 함수의 호출 자체만을 확인해야한다.
성공 테스트
Given
- 삭제를 진행할 더미 데이터를 정보를 추가한다.
- 단, 실제 DB에 더미 데이터를 추가하는 것이 아님 (그냥 준비만 하면 됨)
// given
// 멤버
Member owner = createMember();
Member member2 = Member.of(1000, Status.ACTIVE, "2222", Role.USER);
Member member3 = Member.of(1000, Status.ACTIVE, "3333", Role.USER);
CustomMemberDetails memberDetails = new CustomMemberDetails(owner);
// 상품
Product product = createProduct(owner);
// 북마크
List<Bookmark> bookmarks = Arrays.asList(
createBookmark(product, member2),
createBookmark(product, member3)
);
더미 객체 생성 메서드 추출
- 삭제 테스트에서는, 테스트 케이스마다 더미 객체를 항상 추가해야할 필요가 있다.
- 따라서, 더미 데이터 생성 부분을 메서드로 추출하면 불필요한 코드 중복을 방지할 수 있다.
private Member createMember(){
int mileage = 1000;
Status status = Status.ACTIVE;
String socialId = "1111";
Role role = Role.USER;
Member member = Member.of(mileage, status, socialId, role);
return member;
}
private Product createProduct(Member member){
String name = "상품1";
Integer initialPrice = 10000;
String content = "이것은 상품 설명 부분";
Category category = Category.BOOK;
LocalDateTime deadline = LocalDateTime.now().plusDays(3);
ProductState productState = ProductState.ON_SALE;
Product product = Product.builder()
.name(name)
.initialPrice(initialPrice)
.content(content)
.category(category)
.productState(productState)
.deadline(deadline)
.member(member)
.build();
return product;
}
@Test
void test(){
// given
// 멤버
Member owner = createMember();
CustomMemberDetails memberDetails = new CustomMemberDetails(owner);
// 상품
Product product = createProduct(owner);
}
When
- 해당 메서드 내에서 호출되는 외부 객체(Mock)의 메서드의 행동을 지정한다.
- 그 후, 해당 메서드를 호출
// when
//아래 메서드가 호출되면 위의 더미 데이터가 반환되도록 설정
when(productRepository.findById(product.getId())).thenReturn(Optional.of(product));
when(bookmarkRepository.findByProduct(product)).thenReturn(bookmarks);
//서비스 메서드 호출
productService.deleteProduct(product.getId(), memberDetails);
Then
- 실제 DB에 영향이 가는 것이 아니기에, 호출 검증으로 제대로 호출이 되었는지만 확인
// then
verify(bookmarkRepository, times(bookmarks.size())).delete(any(Bookmark.class));
실패 테스트
- 삭제 테스트를 진행할 때는, 삭제할 때 발생하는 예외가 제대로 잡아지는지 확인을 진행한다.
예외 검증
커스텀 BusinessException인 경우
- 에러 코드가 동일한지 까지 확인한다.
// when
BusinessException exception = assertThrows(BusinessException.class, () -> productService.createProduct(request, images, memberDetails));
// then
assertThat(exception.getErrorCode()).isEqualTo(ProductErrorCode.INVALID_CATEGORY);
내장 예외인 경우
- 해당 예외를 발생시키는지만 확인한다.
assertThrows(IllegalArgumentException.class, () -> productService.readProduct(productId2));
'Spring > 테스트' 카테고리의 다른 글
Service 테스트 - 예외 발생 방법 (0) | 2024.03.12 |
---|---|
Service - 수정 테스트 (0) | 2024.03.12 |
Service - 조회 테스트 (0) | 2024.03.12 |
Service - 생성 테스트 (0) | 2024.03.11 |
Service 테스트 (0) | 2024.03.11 |