[Spring] 단위 테스트, JUnit5, Mockito, 통합 테스트

Jiwoo·2024년 6월 17일
0

Spring

목록 보기
12/19
post-custom-banner

📌 단위 테스트

  • 작은 단위로 쪼개서 각 단위가 정확하게 동작하는지를 검사하는 테스트 기법
  • 빠르게 작성할 수 있고 문제 발생 시 어느 부분이 잘못 되었는지를 빠르고 정확하게 확인 가능

📌JUnit5

  • @Test : 테스트 method임을 선언

  • @RepeatedTest : 반복되는 테스트 작성

  • @Nested : 정적이 아닌 중첩 테스트 클래스임을 나타낸다

  • @DisplayName : 테스트 클래스 또는 메소드의 사용자 정의 이름 선언 가능

  • @BeforeEach : 모든 테스트 실행 전에 수행할 테스트에 사용

  • @AfterEach : 모든 테스트 실행 후에 수행할 테스트에 사용

  • @BeforeAll : 클래스를 실행하기 전 제일 먼저 실행할 테스트 작성, static으로 선언

  • @AfterAll : 현재 클래스 종료 후 해당 테스트 실행, static으로 선언


  • Assertions.assertEquals(expected, actual) : 실제 결과 값이 기대 값과 동일한지 확인할 때 사용하는 메소드
@Test
@DisplayName("assertEquals - Supplier")
void test1_1() {
    Double result = calculator.operate(5, "/", 0);
    // 테스트 실패 시 메시지 출력 (new Supplier<String>())
    assertEquals(2.5, result, () -> "연산자 혹은 분모가 0이 아닌지 확인해보세요!");
}
  • Assertions.assertNotNull(actual)
@Test
@DisplayName("assertNotNull 과 assertNull")
void test3() {
    Double result1 = calculator.operate(5, "/", 2);
    assertNotNull(result1);
    Double result2 = calculator.operate(5, "/", 0);
    assertNull(result2);
}

📌 Mockito

  • 가짜 객체(Mock object) 를 통한 분리 방법

    • 실제 객체와 겉만 같은 객체 (동일 클래스명, 함수명)
    • 실제 DB 작업 X
  • Mockito 적용

@ExtendWith(MockitoExtension.class) // @Mock 사용을 위해 설정합니다.
class ProductServiceTest {

    @Mock
    ProductRepository productRepository;

    @Mock
    FolderRepository folderRepository;

    @Mock
    ProductFolderRepository productFolderRepository;

    @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, folderRepository, productFolderRepository);

        // when
        ProductResponseDto result = productService.updateProduct(productId, requestMyPriceDto);

        // then
        assertEquals(myprice, 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()
        );
    }
}

📌 통합 테스트

  • 두 개 이상의 모듈이 연결된 상태를 테스트 가능
  • 여러 단위 테스트를 하나의 통합된 테스트로 수행
  • 모듈 간의 연결에서 발생하는 에러 검증 가능
  • @SpringBootTest : 스프링이 동작되도록 해준다
post-custom-banner

0개의 댓글