Spring/테스트

Service - 삭제 테스트

초코chip 2024. 3. 12. 13:19

개념

  • 특정 객체가 정상적으로 삭제되는지 확인하는 테스트
  • 주의!: 서비스 테스트는 실제 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