getProduct() 테스트 코드
package com.springboot.test.service.impl;
import com.springboot.test.data.dto.ProductResponseDTO;
import com.springboot.test.data.entity.Product;
import com.springboot.test.data.repository.ProductRepository;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import static org.mockito.Mockito.verify;
import java.util.Optional;
public class ProductServiceTest {
private ProductRepository productRepository = Mockito.mock(ProductRepository.class);
private ProductServiceImpl productService;
@BeforeEach
public void setUpTest() {
productService = new ProductServiceImpl(productRepository);
}
@Test
void getProductTest() {
Product givenProduct = new Product();
givenProduct.setNumber(123L);
givenProduct.setName("펜");
givenProduct.setPrice(1000);
givenProduct.setStock(1234);
Mockito.when(productRepository.findById(123L))
.thenReturn(Optional.of(givenProduct));
ProductResponseDTO productResponseDTO = productService.getProduct(123L);
Assertions.assertEquals(productResponseDTO.getNumber(), givenProduct.getNumber());
Assertions.assertEquals(productResponseDTO.getName(), givenProduct.getName());
Assertions.assertEquals(productResponseDTO.getPrice(), givenProduct.getPrice());
Assertions.assertEquals(productResponseDTO.getStock(), givenProduct.getStock());
verify(productRepository).findById(123L);
}
}
getProcut() 테스트 코드 설명
아래 코드는 Mockito mock 메서드를 통해 ProductRepository를 주입받는 코드이다.
private ProductRepository productRepository = Mockito.mock(ProductRepository.class);
위에서 정의한 productRepository를 기반으로 매 테스트 전 productService 객체를 초기화한다.
@BeforeEach
public void setUpTest() {
productService = new ProductServiceImpl(productRepository);
}
productRepository.findById(123L)이 호출되면 givenProduct를 Return하라는 코드이다.
Optional.of() 메서드는 null이 아닌 값을 가지는 Optional 객체를 반환하는 메서드이다.
Mockito.when(productRepository.findById(123L))
.thenReturn(Optional.of(givenProduct));
이후 productService를 통해서 데이터를 가져온 뒤, 최초에 정의한 데이터와 일치하는지 검증한다.
ProductResponseDTO productResponseDTO = productService.getProduct(123L);
Assertions.assertEquals(productResponseDTO.getNumber(), givenProduct.getNumber());
Assertions.assertEquals(productResponseDTO.getName(), givenProduct.getName());
Assertions.assertEquals(productResponseDTO.getPrice(), givenProduct.getPrice());
Assertions.assertEquals(productResponseDTO.getStock(), givenProduct.getStock());
실제로 위 코드가 실행되었는지 부가검증을 진행한다.
verify(productRepository).findById(123L);
saveProduct() 테스트 코드
package com.springboot.test.service.impl;
import com.springboot.test.data.dto.ProductDTO;
import com.springboot.test.data.dto.ProductResponseDTO;
import com.springboot.test.data.entity.Product;
import com.springboot.test.data.repository.ProductRepository;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.AdditionalAnswers.returnsFirstArg;
import static org.mockito.Mockito.verify;
import java.util.Optional;
public class ProductServiceTest {
private ProductRepository productRepository = Mockito.mock(ProductRepository.class);
private ProductServiceImpl productService;
@BeforeEach
public void setUpTest() {
productService = new ProductServiceImpl(productRepository);
}
@Test
void saveProductTest() {
Mockito.when(productRepository.save(any(Product.class)))
.then(returnsFirstArg());
ProductResponseDTO productResponseDTO = productService.saveProduct(new ProductDTO("펜", 1000, 1234));
Assertions.assertEquals(productResponseDTO.getName(), "펜");
Assertions.assertEquals(productResponseDTO.getPrice(), 1000);
Assertions.assertEquals(productResponseDTO.getStock(), 1234);
verify(productRepository).save(any());
}
}
saveProduct() 테스트 코드 설명
productRepository.save()를 호출하면
returnsFirstArg() 를 리턴한다고 정의하는 코드이다.
Mockito.when(productRepository.save(any(Product.class)))
.then(returnsFirstArg());
any() 는 특정 매개변수의 전달을 설정하지 않고 메서드의 실행만 확인할 때 쓴다.
Uploaded by N2T
'Programming > [Spring Boot]' 카테고리의 다른 글
컨트롤러 테스트 코드 작성 (0) | 2023.03.16 |
---|---|
Gson (0) | 2023.03.16 |
리포지토리 테스트 코드 작성 (0) | 2023.03.16 |
JPA save vs saveAndFlush (0) | 2023.03.16 |
Entity 관련 Annotation (0) | 2023.03.12 |