@ParameterizedTest
@DisplayName("상품 타입이 재고 관련 타입인지를 체크한다.")
@CsvSource({"HANDMADE,false","BOTTLE,true","BAKERY,true"})
@ParameterizedTest
void containsStockType3(ProductType productType, boolean expected) {
// when
boolean result = ProductType.containsStockType(productType);
// then
assertThat(result).isEqualTo(expected);
}
private static Stream<Arguments> provideProductTypesForCheckingStockType() {
return Stream.of(
Arguments.of(ProductType.HANDMADE, false),
Arguments.of(ProductType.BOTTLE, true),
Arguments.of(ProductType.BAKERY, true)
);
}
@DisplayName("상품 타입이 재고 관련 타입인지를 체크한다.")
@MethodSource("provideProductTypesForCheckingStockType")
@ParameterizedTest
void containsStockType5(ProductType productType, boolean expected) {
// when
boolean result = ProductType.containsStockType(productType);
// then
assertThat(result).isEqualTo(expected);
}
- 이외에도 다양한 값을 바꿔가며 테스트 할 수 있는 도구 들이 존재한다. ex) Spock
@Dynamic Test
공유자원을 사용하는 것을 지양한다. 그런데, 만약 시나리오 테스트가 필요하다면?
@DisplayName("재고 차감 시나리오")
@TestFactory
Collection<DynamicTest> stockDeductionDynamicTest() {
// given
Stock stock = Stock.create("001", 1);
return List.of(
DynamicTest.dynamicTest("재고를 주어진 개수만큼 차감할 수 있다.", () -> {
// given
int quantity = 1;
// when
stock.deductQuantity(quantity); //차감
// then
assertThat(stock.getQuantity()).isZero(); //0이됬는지 확인
}),
DynamicTest.dynamicTest("재고보다 많은 수의 수량으로 차감 시도하는 경우 예외가 발생한다.", () -> {
// given
int quantity = 1;
// when // then
assertThatThrownBy(() -> stock.deductQuantity(quantity))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("차감할 재고 수량이 없습니다.");
})
);
}
시나리오
- 재고을 차감 한다. 재고가 0이된다.
- 재고 0에서 차감할 경우 오류가 뜨는지 확인
출처 ; https://www.inflearn.com/course/practical-testing-실용적인-테스트-가이드
'TDD' 카테고리의 다른 글
Spring REST Docs (0) | 2024.12.08 |
---|---|
더 나은 테스트를 작성하기 위한 고민 (0) | 2024.12.01 |
Mockito로 Stubbing 하기 (1) | 2024.12.01 |
응답 예외처리와 책임 분리 (0) | 2024.11.25 |
Presentation Layer의 테스트 (0) | 2024.11.24 |