์๋น์ค
๋๋ฉ์ธ ๋ชจ๋ธ์ ํ์ฉํด ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ๊ณตํ๋ ํต์ฌ ๊ธฐ๋ฅ ์ ๊ณต
ํ ์คํธ ์ฝ๋ ์์ฑ
class ProductServiceTest {
private ProductRepository productRepository = Mockito.mock(ProductRepository.class);
private ProductServiceImpl productService;
@BeforeEach
public void setUpTest() {
productService = new ProductServiceImpl(productRepository);
}
@Test
void saveProduct() {
Mockito.when(productRepository.save(any(Product.class)))
.then(returnsFirstArg());
ProductResponseDto productResponseDto = productService.saveProduct(new ProductDto("pen", 1000, 1234));
assertEquals(productResponseDto.getName(), "pen");
assertEquals(productResponseDto.getPrice(), 1000);
assertEquals(productResponseDto.getStock(), 1234);
verify(productRepository).save(any());
}
}
์ฌ๋ผ์ด์ค ํ ์คํธ๋ฅผ ์ ์ฉํ ์ปจํธ๋กค๋ฌ ๊ฐ์ฒด์ ๋ฌ๋ฆฌ ์๋น์ค ๊ฐ์ฒด๋ ๋จ์ ํ ์คํธ๋ฅผ ์ ์ฉํ์๊ธฐ์ @SpringBootTest, @WebMvcTest์ ๊ฐ์ ์ธ๋ถ ์์ธ์ ๋ชจ๋ ๋ฐฐ์
any()
- Mockito์ ArgumentMatchers์์ ์ ๊ณตํ๋ ๋ฉ์๋๋ก, Mock ๊ฐ์ฒด์ ๋์์ ์ ์ํ๊ฑฐ๋ ๊ฒ์ฆํ๋ ๋จ๊ณ์์ ์กฐ๊ฑด์ผ๋ก ํน์ ๋งค๊ฐ๋ณ์์ ์ ๋ฌ์ ์ค์ ํ์ง ์๊ณ ๋ฉ์๋์ ์คํ๋ง์ ํ์ธํ๊ฑฐ๋ ์ข ๋ ํฐ ๋ฒ์์ ํด๋์ค ๊ฐ์ฒด๋ฅผ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋ฐ๋ ๋ฑ์ ์ํฉ์ ์ฌ์ฉ
- ์ผ๋ฐ์ ์ผ๋ก given()์ผ๋ก ์ ์๋ Mock ๊ฐ์ฒด์ ๋ฉ์๋ ๋์ ๊ฐ์ง๋ ๋งค๊ฐ๋ณ์์ ๋น๊ต๋ฅผ ํตํด ์ด๋ฃจ์ด์ง์ง๋ง, ๋ ํผ๋ฐ์ค ๋ณ์์ ๋น๊ต๋ ์ฃผ์๊ฐ์ผ๋ก ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ any()๋ฅผ ์ฌ์ฉํด ํด๋์ค๋ง ์ ์ํ๋ ๊ฒฝ์ฐ๋ ์กด์ฌ
๋ฆฌํฌ์งํ ๋ฆฌ
๊ฐ๋ฐ์๊ฐ ๊ตฌํํ๋ ๋ ์ด์ด ์ค ๊ฐ์ฅ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ๊น์ด ๋ ์ด์ด
- JpaRepository๋ฅผ ์์๋ฐ์ ๊ธฐ๋ณธ์ ์ธ ์ฟผ๋ฆฌ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ findById(), save()์ ๊ฐ์ ๊ธฐ๋ณธ ๋ฉ์๋์ ๋ํ ํ ์คํธ๋ ํฐ ์๋ฏธ๊ฐ ์์ โ ํ ์คํธ ๊ตฌํ ๋ชฉ์ ์ ๋ํด ๊ณ ๋ฏผํ๊ณ ์์ฑํด์ผ ํจ
- ์ธ๋ถ ์์ธ์ ์ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๋ ์ฌ๋ถ๋ ํ ์คํธ ๋ชฉ์ ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์๊ณ , ์ค์ ์ด์ฉ DB์ ํ ์คํธ์ฉ DB๋ฅผ ๋ค๋ฅด๊ฒ ์ง์ ํ์ฌ ์ฐ๋ํ ์๋ ์์
ํ ์คํธ ์ฝ๋ ์์ฑ
@DataJpaTest
public class ProductRepositoryTestByH2 {
@Autowired
private ProductRepository productRepository;
@Test
void saveTest() {
//given
Product product = new Product();
product.setName("pen");
product.setPrice(1000);
product.setStock(1000);
//when
Product savedProduct = productRepository.save(product);
//then
assertEquals(product.getName(), savedProduct.getName());
assertEquals(product.getPrice(), savedProduct.getPrice());
assertEquals(product.getStock(), savedProduct.getStock());
}
@Test
void selectTest() {
//given
Product product = new Product();
product.setName("pen");
product.setPrice(1000);
product.setStock(1000);
Product savedProduct = productRepository.saveAndFlush(product);
//when
Product foundProduct = productRepository.findById(savedProduct.getNumber()).get();
//then
assertEquals(product.getName(), foundProduct.getName());
assertEquals(product.getPrice(), foundProduct.getPrice());
assertEquals(product.getStock(), foundProduct.getStock());
}
}
given์ ์์ ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๊ณ , ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ์ฌ ๋น๊ต๋ฅผ ํตํด ๊ฒ์ฆ ์ํ
@DataJpaTest
- JPA์ ๊ด๋ จ๋ ์ค์ ๋ง์ ๋ก๋ํด์ ํ ์คํธ ์งํ
- ๊ธฐ๋ณธ์ ์ผ๋ก @Transactional ์ ๋ ธํ ์ด์ ์ ํฌํจํ๊ณ ์์ด ํ ์คํธ ์ฝ๋๊ฐ ์ข ๋ฃ๋๋ฉด ์๋์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋กค๋ฐฑ ์งํ
- ๊ธฐ๋ณธ ๊ฐ์ผ๋ก ์๋ฒ ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๊ณ , @AutoConfigureTestDatabase ์ ๋ ธํ ์ด์ ์ ์ด์ฉํด ๋ณ๋๋ก ์ค์ ์ ํ์ฌ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ด์ฉํ ์ ์์(ํด๋น ์์์์๋ H2 ์ฌ์ฉ)
@SpringBootTest๋ฅผ ์ด์ฉํ CRUD ํ ์คํธ
@SpringBootTest
public class ProductRepositoryTest {
@Autowired
ProductRepository productRepository;
@Test
public void basicCRUDTest() {
//create
Product givenProduct = Product.builder()
.name("pen")
.price(5000)
.stock(2000)
.build();
Product savedProduct = productRepository.save(givenProduct);
assertThat(savedProduct.getNumber())
.isEqualTo(givenProduct.getNumber());
assertThat(savedProduct.getName())
.isEqualTo(givenProduct.getName());
assertThat(savedProduct.getPrice())
.isEqualTo(givenProduct.getPrice());
assertThat(savedProduct.getStock())
.isEqualTo(givenProduct.getStock());
//read
Product selectedProduct = productRepository.findById(savedProduct.getNumber())
.orElseThrow(RuntimeException::new);
assertThat(selectedProduct.getNumber())
.isEqualTo(givenProduct.getNumber());
assertThat(selectedProduct.getName())
.isEqualTo(givenProduct.getName());
assertThat(selectedProduct.getPrice())
.isEqualTo(givenProduct.getPrice());
assertThat(selectedProduct.getStock())
.isEqualTo(givenProduct.getStock());
//update
Product foundProduct = productRepository.findById(selectedProduct.getNumber())
.orElseThrow(RuntimeException::new);
foundProduct.setName("toy");
Product updatedProduct = productRepository.save(foundProduct);
assertEquals(updatedProduct.getName(), "toy");
//delete
productRepository.delete(updatedProduct);
assertFalse(productRepository.findById(selectedProduct.getNumber()).isPresent());
}
}
@SpringBootTest ์ ๋ ธํ ์ด์ ์ ํ์ฉํ๋ฉด ์คํ๋ง์ ๋ชจ๋ ์ค์ ์ ๊ฐ์ ธ์ค๊ณ , ์ ์ฒด์ ์ธ ๋น ์ค์บ๋ ์งํํ๊ธฐ ๋๋ฌธ์ ์์กด์ฑ ์ฃผ์ ์ ๋ํด ๊ณ ๋ฏผํ ํ์ ์์ด ํ ์คํธ๊ฐ ๊ฐ๋ฅํ์ง๋ง ์๋๊ฐ ๋๋ฆฌ๋ค๋ ๋จ์ ์ด ์กด์ฌ