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을 별도로 둔다.