ν μ€νΈ νκ²½μ λ 립μ±μ 보μ₯νμ
μλμ κ°μ ν μ€νΈ μ½λκ° μλ€κ³ μκ°νμ.
@DisplayName("μ¬κ³ κ° λΆμ‘±ν μνμΌλ‘ μ£Όλ¬Έμ μμ±νλ €λ κ²½μ° μμΈκ° λ°μνλ€.")
@Test
void createOrderWithNoStock() {
// given
LocalDateTime registeredDateTime = LocalDateTime.now();
Product product1 = createProduct(BOTTLE, "001", 1000);
Product product2 = createProduct(BAKERY, "002", 3000);
Product product3 = createProduct(HANDMADE, "003", 5000);
productRepository.saveAll(List.of(product1, product2, product3);
Stock stock1 = Stock.create("001", 2);
Stock stock2 = Stock.create("002", 2);
stock1.deductQuantity(1); // μλμ κ°μμν€λ λ©μλ
stockRepository.saveAll(List.of(stock1, stock2));
OrderCreateServiceRequest request = OrderCreateServiceRequest.builder()
.productNumbers(List.of("001", "001", "002", "003")
.build();
// when // then
assertThatThrownBy(() -> orderService.createOrder(reqeust, requestDateTime))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("μ¬κ³ κ° λΆμ‘±ν μνμ΄ μμ΅λλ€.");
}
μ ν μ€νΈ μ½λμμ νμΈνκ³ μΆμ κ²μ μ¬κ³ κ° λΆμ‘±ν μνμΌλ‘ μ£Όλ¬Έμ μμ±ν λ μ¬λ°λ₯Έ μμΈκ° λ°μνλμ§μ΄λ€.
stock1.deductQuantity(1); // μλμ κ°μμν€λ λ©μλ
λ¬Έμ λ μ λ©μλμΈλ°,
μ λ©μλλ₯Ό μ¬μ©ν¨μΌλ‘μ¨ ν μ€νΈ νκ²½μ λ 립μ±μ 보μ₯ν μ μκ² λ κ²μ΄λ€.
νμ¬ ν μ€νΈ μ½λμμ `stock1`μ μ¬κ³ μλμ 2μ΄λ€.
μ΄λ `stock1.deductQuantity(1);`μ΄ μλλΌ `stock1.deductQuantity(3);`μ νλ€λ©΄, μ¬κ³ μλμ΄ λΆμ‘±νμ¬ "μ°¨κ°ν μ¬κ³ μλμ΄ μμ΅λλ€."λΌλ μμΈ λ©μμ§λ‘ ν μ€νΈκ° μ€ν¨νλ€.
μ¦, μ¬κ³ μ°¨κ° λ©μλλ‘ μΈν΄ μ£Όλ¬Έ μμ± μ μ¬κ³ λΆμ‘± ν μ€νΈ νκ²½μ λ 립μ±μ΄ 보μ₯λμ§ μμ κ²μ΄λ€.
ν λμ λ€μ΄μ€λ Test Fixture ꡬμ±νκΈ°
β Fixture: κ³ μ λ¬Ό, κ³ μ λμ΄ μλ 물체
Test Fixtureλ ν μ€νΈλ₯Ό μν΄ μνλ μνλ‘ κ³ μ μν¨ κ°μ²΄λ‘, given μ μ ꡬμ±ν λ μ£Όλ‘ λ§λκ² λλ€. ν μ€νΈκ° μμλκΈ° μ μ νμν μ΄κΈ° μνλ₯Ό μ€μ νκ±°λ νμν λ°μ΄ν° λλ κ°μ²΄λ₯Ό μ€λΉνλ μν μ νλ€.
κ²°λ‘ λΆν° λ§νμλ©΄, Test Fixtureλ₯Ό ννΈννλ κ²μ "λ¬Έμ"λ‘μμ ν μ€νΈλ₯Ό ꡬμ±ν λ μ΄ν΄νκΈ° μ΄λ ΅κ² λ§λ λ€.
ν μ€νΈλ λ¨μν μ½λμ λμμ κ²μ¦νλ κ²μ λμ΄, ν μ€νΈμ μλλ₯Ό λ¬Έμμ²λΌ λͺ νν λλ¬λ΄μΌ νλ€. ν μ€νΈλ₯Ό μ½λ μ¬λμ΄ givenμ λ§ λ³΄κ³ λ "μ΄ ν μ€νΈκ° μ΄λ€ μν©μ μ€μ νκ³ μ νλμ§"λ₯Ό μ½κ² μ΄ν΄ν μ μμ΄μΌ νλ€.
λ°λΌμ givenμ μ΄ κΈΈμ΄μ§λλΌλ ν μ€νΈκ° λ¨λ μΌλ‘ λμνλλ‘ κ΅¬μ±νλ κ²μ΄ λ°λμ§νλ€.
μΌλ‘λ‘, λͺ λ μ μ¬μ΄λ νλ‘μ νΈλ₯Ό μ§νν λμλ μλμ²λΌ Test Fixtureλ₯Ό λ³λμ ν΄λμ€λ‘ λΆλ¦¬νκΈ°λ νμλ€.
@Getter
@AllArgsConstructor
@RequiredArgsConstructor
public enum PetInfoFixture {
VALID_PET("체리", 10, FOX, MALE, "hello! I'm 10 years Old, Wild fox!");
private String name;
private Integer age;
private PetType type;
private String bio;
public PetInfo toEntity() {
return PetInfo.builder()
.name(name)
.age(age)
.type(type)
.bio(bio)
.build();
}
public PetProfileCreateRequest toRequest() {
return PetProfileCreateRequest.builder()
.name(name)
.age(age)
.type(type.toString())
.bio(bio)
.build();
}
}
μ΄ λΉμμλ ν μ€νΈ μ½λμ λν΄ μ λͺ¨λ₯΄λ μνμκΈ° λλ¬Έμ Test Fixtureλ₯Ό λ°λ‘ λΆλ¦¬νλ κ²μ΄ κΉλν΄ λ³΄μκ³ , μν κ³Ό μ± μμ λͺ νν νλ κ²μ΄λΌ μκ°νμλ€. νμ§λ§ μ§κΈ μκ°ν΄λ³΄λ©΄, μ΄λ° λ°©μμ μ§λμΉκ² μΌλ°νλμ΄ κ° ν μ€νΈμ λ§₯λ½μ λͺ νν λλ¬λ΄λ λ° μννλ λ°©λ²μ΄μλ€κ³ μκ°λλ€.
'π» Knowledge > ν μ€νΈμ½λ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
| deleteAllInBatch() vs deleteAll() λ©μλμ μ°¨μ΄ (0) | 2024.12.31 |
|---|---|
| Test Doubles μ 리 (0) | 2024.12.27 |
| Presentation Layer ν μ€νΈ (1) | 2024.12.27 |
| @SpringBootTest vs @DataJpaTest (0) | 2024.12.19 |
| Persistence Layer ν μ€νΈ (2) | 2024.12.19 |