Projects/HubEleven

[동시성 처리] 재고 감소 통합 테스트 코드 5 - 단일 스레드

annovation 2026. 1. 30. 17:27

단일 스레드 환경 리팩토링 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 패턴은 도입하지 않았다.