안녕하세요, 오늘은 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("차감할 재고 수량이 없습니다.");
})
);
}
테스트를 돌려보면 잘 통과됩니다.
간단하죠? 조금이나마 도움이 되었으면 좋겠습니다.
오늘의 포스팅을 여기서 마치겠습니다. 감사합니다.