TestCode

private 메서드 테스트

salmon16 2024. 7. 18. 11:23

개요

private메서드를 테스트하고 싶은 경우가 있을 때 어떻게 진행해야 하는지 알아보려고 한다.

 

본론

1. 할 필요가 없다. (하려고 해서도 안된다.)

2. 만약 필요하다면 객체를 분리할 시점인가를 고민해야 한다.

 

먼저 1번의 경우에 대해 알아보자

 

아래의 코드는 createNectProductNumber이라는 private 메서드가 존재하는데 이 메서드의 역할은 카페 키오스크에서 새로운 상품이 등록될 때 기존 상품의 마지막 번호에 +1 해서 return 하는 메서드이다. 

ex) 아메리카노 001 , 빵 002 , 라떼 003이라는 상풍 번호를 가지고 있을 때 케이크를 추가하려면 위 메서드를 사용해 004라는 상품 번호로 등록하게 된다. 

 

@RequiredArgsConstructor
@Service
@Transactional(readOnly = true)
public class ProductService {

    private final ProductRepository productRepository;


    @Transactional
    public ProductResponse createProduct(ProductCreateRequest request) {
        String nextProductNUmber = createNextProductNumber();

        Product product = request.toEntity(nextProductNUmber);
        Product savedProduct = productRepository.save(product);

        return ProductResponse.of(savedProduct);
    }

    private String createNextProductNumber() {
        //productNumber
        String latestProductNumber = productRepository.findLatestProductNumber();
        if (latestProductNumber == null) {
            return "001";
        }
        int lastestProductNumberInt = Integer.parseInt(latestProductNumber);
        int nextProductNUmberInt = lastestProductNumberInt + 1;
        return String.format("%03d", nextProductNUmberInt);
    }

}

 

외부에서 봤을 때 public메서드만 알면 되기 때문에 즉 클라이언트는 private 메서드를 알 필요가 없다. 그렇기 때문에 private 테스트를 하지 않아도 된다 

createProduct 메서드를 테스트를 진행하게 된다면 자연스럽게 createNextProductNumber도 테스트가 진행되기 때문이다. 

 

2번의 경우에 대해 알아보자

 

만약 private 메서드를 테스트하고 싶다면 객체의 분리를 생각해 보아야 한다.

 

객체를 분리하기 위해 ProductNumberFactory클래스를 만들어 분리할 수 있다.

@Component
@RequiredArgsConstructor
public class ProductNumberFctory {

    private final ProductRepository productRepository;

    public String createNextProductNumber() {
        //productNumber
        String latestProductNumber = productRepository.findLatestProductNumber();
        if (latestProductNumber == null) {
            return "001";
        }
        int lastestProductNumberInt = Integer.parseInt(latestProductNumber);
        int nextProductNUmberInt = lastestProductNumberInt + 1;
        return String.format("%03d", nextProductNUmberInt);
    }
}

 

위 클래스를 ProductService에서 주입받아 사용하면 된다. 

그리고 createNectProductNumber를 테스트를 진행하면 된다.

'TestCode' 카테고리의 다른 글

테스트에서만 필요한 메서드가 생겼을 때는?  (0) 2024.07.18
테스트 Spring boot 띄어지는 수 줄이기  (0) 2024.07.18
테스트 팁  (0) 2024.07.17
classicist vs mockist  (0) 2024.07.17
Mockito.verify  (0) 2024.07.16