Mockito는 Mock 객체를 쉽게 만들 수 있는 방법 제공하는 Java용 오픈 소스 테스트 프레임워크이다.
풍부한 assertions 세트와 유용한 오류 메시지를 제공하고 테스트 코드 가독성을 향상시키며, IDE내에서 매우 쉽게 사용할 수 있도록 설계된 Java 라이브러리
testImplementation 'org.springframework.boot:spring-boot-starter-test'
import static org.assertj.core.api.Assertions.*;
가장 흔히 쓰이는 Test Code 스타일을 표현하는 방식으로 테스트 코드를 Given(준비)/When(실행)/Then(검증) 세 단계로 나누는 패턴
인텔리제이에서 테스트를 작성하려는 클래스명 위에 커서를 대고
cmd + shift + t
를 누르면 테스트 클래스를 자동 생성해준다.
@ExtendWith(MockitoExtension.class) // @Mock 사용 설정
class ProductServiceTest {
@Mock // 가짜 객체 주입해줌
ProductRepository productRepository;
@Mock
FolderRepository folderRepository;
@Mock
ProductFolderRepository productFolderRepository;
@InjectMocks // 매개변수에 가짜 객체를 주입해줌
ProductService productService;
@Test
@DisplayName("관심 상품 희망가 - 최저가 이상으로 변경")
void test1() {
// given
Long productId = 100L;
int myprice = ProductService.MIN_MY_PRICE + 3_000_000;
ProductMypriceRequestDto requestMyPriceDto = new ProductMypriceRequestDto();
requestMyPriceDto.setMyprice(myprice);
User user = new User();
ProductRequestDto requestProductDto = new ProductRequestDto(
"Apple <b>맥북</b> <b>프로</b> 16형 2021년 <b>M1</b> Max 10코어 실버 (MK1H3KH/A) ",
"https://shopping-phinf.pstatic.net/main_2941337/29413376619.20220705152340.jpg",
"https://search.shopping.naver.com/gate.nhn?id=29413376619",
3515000
);
Product product = new Product(requestProductDto, user);
given(productRepository.findById(productId)).willReturn(Optional.of(product));
// when
ProductResponseDto result = productService.updateProduct(productId, requestMyPriceDto);
/*// then
assertEquals(myprice, result.getMyprice());*/
// then (assertJ ver.)
assertThat(myprice).isEqualTo(result.getMyprice());
}
@Test
@DisplayName("관심 상품 희망가 - 최저가 미만으로 변경")
void test2() {
// given
Long productId = 200L;
int myprice = ProductService.MIN_MY_PRICE - 50;
ProductMypriceRequestDto requestMyPriceDto = new ProductMypriceRequestDto();
requestMyPriceDto.setMyprice(myprice);
ProductService productService = new ProductService(productRepository, folderRepository, productFolderRepository);
/* // when
Exception exception = assertThrows(IllegalArgumentException.class, () -> {
productService.updateProduct(productId, requestMyPriceDto);
});
// then
assertEquals(
"유효하지 않은 관심 가격입니다. 최소 " +ProductService.MIN_MY_PRICE + " 원 이상으로 설정해 주세요.",
exception.getMessage()
); */
// when & then (assertJ ver.)
assertThatThrownBy(() -> productService.updateProduct(productId, requestMyPriceDto))
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("유효하지 않은 관심 가격입니다. 최소 " +ProductService.MIN_MY_PRICE + "원 이상으로 설정해주세요.");
}
}