Java에서 단위 테스트를 작성할 때 JUnit과 Mockito를 주로 사용합니다.
TDD(Test Driven Development) 방식을 사용할 때는 테스트 코드를 먼저 작성하고, 그 다음에 기능을 개발합니다. 그래서 실패하는 테스트 코드를 먼저 작성하고, 그 테스트를 통과하는 기능을 개발하는 것이 일반적입니다.
아래는 해당 메서드에 대한 기본적인 JUnit 테스트입니다.
이 테스트는 정상적인 경우를 가정하고 있으며, 제품이 존재하고 그에 대한 정보가 정확히 반환되는지를 확인합니다:
@Test
public void testFindOneProductById() {
// given
Product mockProduct = new Product();
mockProduct.setId(1L);
mockProduct.setName("Test product");
mockProduct.setImg("Test image");
mockProduct.setPrice(100L);
Mockito.when(productRepository.findById(Mockito.anyLong())).thenReturn(Optional.of(mockProduct));
// When
FindProductResponseDto response = productService.findProductOneById(1L);
// Then
Assertions.assertEquals(mockProduct.getName(), response.getName());
Assertions.assertEquals(mockProduct.getImg(), response.getImg());
Assertions.assertEquals(mockProduct.getPrice(), response.getPrice());
}
@Test
public void FindAllProduct() {
// Given
Product mockProduct1 = new Product();
mockProduct1.setId(1L);
mockProduct1.setName("Test product 1");
mockProduct1.setImg("Test image 1");
mockProduct1.setPrice(100L);
Product mockProduct2 = new Product();
mockProduct2.setId(2L);
mockProduct2.setName("Test product 2");
mockProduct2.setImg("Test image 2");
mockProduct2.setPrice(200L);
List<Product> mockProducts = Arrays.asList(mockProduct1, mockProduct2);
Mockito.when(productRepository.findAll()).thenReturn(mockProducts);
// When
List<Product> products = productRepository.findAll();
// Then
Assertions.assertEquals(2, products.size());
Assertions.assertEquals(mockProduct1, products.get(0));
Assertions.assertEquals(mockProduct2, products.get(1));
}
}
findProductOneById 메서드를 테스트하므로, productRepository.findById(id)가 호출되면 원하는 Product 객체를 반환하도록 mock 설정을 해야 합니다.
이후 기능 개발 코드를 작성한다.
@Service
@AllArgsConstructor
public class ProductService {
private final IProductRepository productRepository;
public FindProductOneResponseDto findProductOneById(
Long id
) {
System.out.println("상품 조회 요청: " + id);
Product findProduct = productRepository.findById(id)
.orElseThrow(() -> new HttpException("존재하지 않는 상품입니다.", HttpStatus.NOT_FOUND));
FindProductOneResponseDto findProductOneResponseDto = new FindProductOneResponseDto();
findProductOneResponseDto.setName(findProduct.getName());
findProductOneResponseDto.setImg(findProduct.getImg());
findProductOneResponseDto.setPrice(findProduct.getPrice());
return findProductOneResponseDto;
}
public FindProductResponseDto findProduct() {
System.out.println("상품 목록 조회 요청");
FindProductResponseDto findProductResponseDto = new FindProductResponseDto();
findProductResponseDto.setProducts(productRepository.findAll());
return findProductResponseDto;
}