JUnit5 의@DynamicTest으로 일련의 시나리오 환경 테스트

Jiwon Jung·2023년 5월 11일
0
post-thumbnail

안녕하세요, 오늘은 JUnit5에서 시나리오 환경 테스트하는 방법을 소개하고자 합니다.

@DynamicTest은 어떠한 하나의 환경을 설정해놓고 이 환경에 변화를 주어 중간중간 검증을 하는 일련의 시나리오를 테스트 하고 싶을 때 사용하기에 좋습니다.

형태는 다음과 같습니다.
@Test 대신에 @TestFactory를 사용합니다.
그리고 반환값으로 Collection이나 Stream 등과 같은 Returnable한 (반환값이 있는) 형태로 만들어주면 됩니다.
그리고 List 형태로 Dynamic테스트를 여러 건 던지면서 일련의 시나리오를 단계적으로 구성할 수 있습니다.
(참고로 저는 아래의 템플릿으로 하나 live template에 등록해서 사용하고 있습니다!! ㅎㅎ 그러면 원하는 단축키 누르면 아래의 템클릿이 짜잔 나타나서 작성하기 쉬워져요!!)

실제 작성 예시를 보여드리겠습니다.
재고 차감 관련 두 개의 시나리오로 나누어 작성했습니다.

첫 번째 시나리오: 1개의 재고가 주어진 상태에서 재고 1개를 차감하게 되면 재고는 이제 0이 되게 됩니다.

두 번째 시나리오: 0인 재고에서 또 하나의 재고 1개를 감소하려고 하면 예외가 발생하게 됩니다.

@DisplayName("재고 차감 시나리오")
@TestFactory
Collection<DynamicTest> stockDeductionDynamicTest() {
        // given
        Stock stock = Stock.create("abc001", 1);

        return List.of(
                DynamicTest.dynamicTest("재고를 주어진 개수만큼 차감할 수 있다.", () -> {
                    // given
                    int quantity = 1;

                    // when
                    stock.deductQuantity(quantity);

                    // then
                    assertThat(stock.getQuantity()).isZero();
                }),

                DynamicTest.dynamicTest("재고보다 많은 수의 수량으로 차감 시도하는 경우 예외가 발생한다.", () -> {
                    // given
                    int quantity = 1;

                    // when , then
                    assertThatThrownBy(() -> stock.deductQuantity(quantity))
                            .isInstanceOf(IllegalArgumentException.class)
                            .hasMessage("차감할 재고 수량이 없습니다.");
                })
        );
}

테스트를 돌려보면 잘 통과됩니다.
간단하죠? 조금이나마 도움이 되었으면 좋겠습니다.
오늘의 포스팅을 여기서 마치겠습니다. 감사합니다.

profile
게을러지고 싶어 부지런한 개발자

0개의 댓글