단일 스레드 환경 리팩토링 with TestFixture
💡Test Fixture 도입 전 단일 스레드 테스트 코드
1) @BeforeEach
@BeforeEach
public void setUp() {
// 테스트용 고정 ID 생성 (각 테스트마다 새로 생성)
testProductId = UUID.randomUUID(); // TODO : Test Fixture
testCompanyId = UUID.randomUUID();
testHubId = UUID.randomUUID();
Stock stock = Stock.create(testProductId, testCompanyId, testHubId, 100);
jpaStockRepository.saveAndFlush(stock);
}
2) decreaseStock_success
@Test
@DisplayName("재고 감소 - 단일 요청 성공")
void decreaseStock_success() {
// given
int decreaseAmount = 10;
StockRequests.Decrease request = new StockRequests.Decrease(testProductId, decreaseAmount);
// when
StockResult result = stockServiceImpl.decreaseStock(request);
// then - 반환값 검증
assertThat(result.productId()).isEqualTo(testProductId);
assertThat(result.productId()).isEqualTo(testCompanyId);
assertThat(result.productId()).isEqualTo(testHubId);
assertThat(result.quantity()).isEqualTo(90L);
// then - 실제 DB 재고 검증
Stock updatedStock =
jpaStockRepository
.findByProductId(testProductId)
.orElseThrow(() -> new AssertionError("재고가 존재해야 합니다"));
assertThat(updatedStock.getQuantity()).isEqualTo(90L);
}
💡Test Fixture 도입 후 단일 스레드 테스트 코드
1) @BeforeEach
@BeforeEach
public void setUp() {
jpaStockRepository.saveAndFlush(StockFixture.createDefault());
}
- Fixture 로 책임 이동
2) decreaseStock_success
@Test
@DisplayName("재고 감소 - 단일 요청 성공")
void decreaseStock_success() {
// given
int decreaseAmount = 10;
StockRequests.Decrease request = StockFixture.decreaseRequest(decreaseAmount);
// when
StockResult result = stockServiceImpl.decreaseStock(request);
// then - 반환값 검증
assertThat(result.productId()).isEqualTo(StockFixture.PRODUCT_ID);
assertThat(result.productId()).isEqualTo(StockFixture.COMPANY_ID);
assertThat(result.productId()).isEqualTo(StockFixture.HUB_ID);
assertThat(result.quantity()).isEqualTo(90);
// then - 실제 DB 재고 검증
Stock updatedStock =
jpaStockRepository
.findByProductId(StockFixture.PRODUCT_ID)
.orElseThrow(() -> new AssertionError("재고가 존재해야 합니다"));
assertThat(updatedStock.getQuantity()).isEqualTo(90);
}
StockFixture.java
💡test/java/com.hubeleven.product/stock/application/fixtures/StockFixture.java
public class StockFixture {
// ===== 고정 ID =====
public static final UUID PRODUCT_ID =
UUID.fromString("11111111-1111-1111-1111-111111111111");
public static final UUID COMPANY_ID =
UUID.fromString("22222222-2222-2222-2222-222222222222");
public static final UUID HUB_ID =
UUID.fromString("33333333-3333-3333-3333-333333333333");
// ===== Factory Methods =====
public static Stock createDefault() {
return Stock.create(PRODUCT_ID, COMPANY_ID, HUB_ID, 100);
}
public static Stock createWithQuantity(int quantity) {
return Stock.create(PRODUCT_ID, COMPANY_ID, HUB_ID, quantity);
}
public static StockRequests.Decrease decreaseRequest(int quantity) {
return new StockRequests.Decrease(PRODUCT_ID, quantity);
}
private StockFixture() {
}
}
- 우선 현재 테스트에서 바뀌는 필드는 quantity 하나이기 때문에, Builder 패턴은 도입하지 않았다.
'Projects > HubEleven' 카테고리의 다른 글
| [동시성 처리] 재고 감소 통합 테스트 코드 6 - test DB (0) | 2026.01.31 |
|---|---|
| [동시성 처리] 재고 감소 통합 테스트 코드 4 - 단일 스레드 (0) | 2026.01.29 |
| [리팩토링] 권한 별 기능 제한 로직 구현 (3) (업데이트 중..) (0) | 2026.01.16 |
| [리팩토링] 공통 모듈 수정으로 인한 리팩토링 (0) | 2026.01.15 |
| [리팩토링] 권한 별 기능 제한 로직 구현 (2) (0) | 2026.01.08 |