์ง€๋‚œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๊ฐœ๋…์— ์ด์–ด์„œ Mockito๋ฅผ ์—ฐ์Šตํ•ด๋ณด์ž

productService์— ์žˆ๋Š” update ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•ด๋ณด์ž

@Transactional
public ProductResponseDto updateProduct(Long id, ProductMypriceRequestDto requestDto) {
    int myprice = requestDto.getMyprice();
    if (myprice < MIN_MY_PRICE) {
        throw new IllegalArgumentException("์œ ํšจํ•˜์ง€ ์•Š์€ ๊ด€์‹ฌ ๊ฐ€๊ฒฉ์ž…๋‹ˆ๋‹ค. ์ตœ์†Œ " + MIN_MY_PRICE + "์› ์ด์ƒ์œผ๋กœ ์„ค์ •ํ•ด ์ฃผ์„ธ์š”.");
    }
    Product product = productRepository.findById(id)
            .orElseThrow(() -> new NullPointerException("ํ•ด๋‹น ์ƒํ’ˆ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."));
 
    product.update(requestDto);
 
    return new ProductResponseDto(product);
}

์—ฌ๊ธฐ์„œ ๋“ค ์ˆ˜ ์žˆ๋Š” ์˜๋ฌธ

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‚˜? repository์— ์žˆ๋Š” findById๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜์ง€? ๋ผ๋Š” ์˜๋ฌธ์ด ๋“ค ์ˆ˜ ์žˆ๋‹ค

ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ํ…Œ์ŠคํŠธ ํ•˜๊ณ  ์‹ถ์€๊ฑด findById๊ฐ€ ์•„๋‹ˆ๋ผ ์„œ๋น„์Šค์— ์žˆ๋Š” update ์ฝ”๋“œ ์ž์ฒด๊ฐ€ ์ž˜ ์ฒ˜๋ฆฌ๋˜๋Š”์ง€์ด๋‹ค

repository๊ฐ€ ์•„๋‹ˆ๋ผ service๋งŒ ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ์œ„ํ•ด Mock Object๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

๊ทธ๋ฆฌ๊ณ  ๊ทธ Mock Object๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ Mockito ์ด๋‹ค

Mockito

@ExtendWith(MockitoExtension.class) // @Mock ์‚ฌ์šฉ์„ ์œ„ํ•ด ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
class ProductServiceTest {
 
    @Mock
    ProductRepository productRepository;
 
    @Mock
    FolderRepository folderRepository;
 
    @Mock
    ProductFolderRepository productFolderRepository;
    ...
 

Mockito๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋”ฐ๋กœ dependency๋ฅผ ์ถ”๊ฐ€ํ•  ํ•„์š”๋Š” ์—†๋‹ค

@ExtendWith(MockitoExtension.class) ์• ๋…ธํ…Œ์ด์…˜์„ ๋‹ฌ์•„์„œ ์„ค์ •ํ•ด์ฃผ๊ณ  Mock ์˜ค๋ธŒ์ ํŠธ๋กœ ์‚ฌ์šฉํ•  ๊ฐ€์งœ ๊ฐ์ฒด(ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค)๋ฅผ @Mock ์• ๋…ธํ…Œ์ด์…˜์„ ๋‹ฌ์•„์ฃผ๋ฉด Mockito๊ฐ€ ๊ฐ€์งœ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค

@Test
@DisplayName("๊ด€์‹ฌ ์ƒํ’ˆ ํฌ๋ง๊ฐ€ - ์ตœ์ €๊ฐ€ ์ด์ƒ์œผ๋กœ ๋ณ€๊ฒฝ")
void test1() {
    // given
    Long productId = 100L;
    int myprice = ProductService.MIN_MY_PRICE + 3_000_000;
 
    ProductMypriceRequestDto requestMyPriceDto = new ProductMypriceRequestDto();
    requestMyPriceDto.setMyprice(myprice);
 
    ProductService productService = new ProductService(productRepository, productFolderRepository, folderRepository);
 
    // when
    ProductResponseDto result = productService.updateProduct(productId, requestMyPriceDto);
 
    // then
    assertEquals(myprice, result.getMyprice());
}
  • given
    • productId์™€ myprice๋ฅผ ์ž„์˜๋กœ ๋„ฃ์–ด์ค€๋‹ค
    • setMyprice๋ฅผ ์ด์šฉํ•ด requestMyPriceDto๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค
    • ๊ทธ๋ฆฌ๊ณ  productService๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์ค€๋‹ค
  • when
    • ์‹ค์ œ๋กœ productService๋ฅผ ์‹คํ–‰ํ•ด result๊ฐ’์„ ๋ฐ›๋Š”๋‹ค
  • then
    • assertEquals๋ฅผ ์ด์šฉํ•ด ๋‚ด๊ฐ€ ๋„ฃ์€ myprice์™€ ๊ฒฐ๊ณผ๋ฌผ์˜ myprice๊ฐ€ ๊ฐ™์€์ง€ ๋น„๊ตํ•ด Update๊ฐ€ ์ž˜ ์ˆ˜ํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค

ํ•˜์ง€๋งŒ ์ด๋Œ€๋กœ ์‹คํ–‰ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค

๊ฐ€์งœ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์ „๋‹ฌํ•ด์ฃผ๊ธฐ๋งŒ ํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ ์ผ€์ด์Šค๋ฅผ ์ œ๋Œ€๋กœ ์ •์˜ํ•ด์„œ ๋„˜๊ฒจ์ค˜์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” update๊ฐ€ ์ œ๋Œ€๋กœ ๋˜๋Š”๊ฐ€? ๊ฐ€ ์ค‘์š”ํ•œ ํฌ์ธํŠธ์ด๋‹ค

์‚ฌ์šฉ ์ผ€์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•œ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ๋ณด์ž

@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);
 
    ProductService productService = new ProductService(productRepository,folderRepository, productFolderRepository);
 
    given(productRepository.findById(productId)).willReturn(Optional.of(product));
 
    // when
    ProductResponseDto result = productService.updateProduct(productId, requestMyPriceDto);
 
    // then
    assertEquals(myprice, result.getMyprice());
}

product๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋ถ€๋ถ„์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค (User, ProductRequestDto)

๊ทธ๋ฆฌ๊ณ  Mockito์— given์ด๋ผ๋Š” method๋ฅผ ์ด์šฉํ•ด ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ๋‹ค

(ํŽธ-์•ˆ)