WEBBOOK CHAPTER

실무 스프링 배치 6: 38장. Restart Integration Test를 코드로 고정한다

38장. Restart Integration Test를 코드로 고정한다

단위 test만으로 repository와 transaction 경계를 검증할 수 없다. integration test는 고정 database를 초기화하고 첫 실행을 실패시킨 다음 같은 parameter로 restart한다. 실패를 wall-clock이나 random에 의존시키지 않고 failAfterOrderId 같은 test 전용 switch로 고정한다.


@Test
void restartsSameInstanceWithoutDuplicateSettlement() {
  var parameters = jobParameters("2026-08-14", fixtureSha256);
  failureSwitch.failOn("ord-0601");
  assertThat(jobOperator.start(job, parameters).getStatus()).isEqualTo(FAILED);
  assertThat(countSettlements()).isEqualTo(600);

  failureSwitch.disable();
  assertThat(jobOperator.restart(lastExecutionId()).getStatus()).isEqualTo(COMPLETED);
  assertThat(countSettlements()).isEqualTo(1000);
  assertThat(countDuplicateBusinessKeys()).isZero();
  assertThat(reconciliationMismatch()).isZero();
}

실제 6.0 API의 비동기 실행 방식에 맞춰 completion을 기다리는 helper를 두고 timeout을 명시한다. assertion 실패 시 execution ID와 step counters를 출력한다. test 종료 뒤 metadata를 무조건 지우지 말고 실패 분석 artifact로 남길 CI job을 별도로 둔다.