최근 Spring Batch 5로 버전이 올라가면서 많은 변화가 생기게 되었다. Spring Batch 5에서 테스트 코드를 작성하고자 하는 사람에게 도움이 되면 좋겠다는 마음에 이번 게시글에서는 Spring Batch 5 에서 Job에 대한 테스트 코드를 작성한 내용에 대해서 기술하겠다.
spring:
h2:
console:
enabled: true # /h2-console 설정
datasource:
meta:
hikari:
driver-class-name: org.h2.Driver
jdbc-url: jdbc:h2:mem:meta
username: sa
password:
domain:
hikari:
driver-class-name: org.h2.Driver
jdbc-url: jdbc:h2:mem:domain
username: sa
password:
auto-commit: false
batch:
job:
enabled: false
jdbc:
initialize-schema: always
jpa:
properties:
hibernate:
format_sql: true # SQL 보기 좋게 출력
highlight_sql: true # SQL 색깔
hbm2ddl.auto: create-drop
default_batch_fetch_size: 100
open-in-view: false
show-sql: true
위 설정 파일은 테스트 환경에서 H2 데이터베이스를 사용하도록 구성되어 있으며, Spring Batch와 JPA의 기본 설정을 포함하고 있다.
@Profile("test")
@Bean
public DataSourceInitializer metaDataSourceInitializer() {
DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();
dataSourceInitializer.setDataSource(metaDataSource());
ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator();
databasePopulator.addScript(new ClassPathResource("sql/batch-postgresql.sql"));
dataSourceInitializer.setDatabasePopulator(databasePopulator);
return dataSourceInitializer;
}
@EnableBatchProcessing 또는 DefaultBatchConfiguration를 사용하여 Batch 설정을 커스텀할 경우에는 pring Batch의 자동 설정이 적용되지 않는다. 그래서 테스트 환경에서 메타 데이터베이스를 초기화하기 위한 DataSourceInitializer 빈을 설정한다.
@ActiveProfiles(value = "test")
@SpringBatchTest
@SpringBootTest
public class PaymentExecutionJobTest {
@Autowired
JobLauncherTestUtils jobLauncherTestUtils;
@Autowired
@Qualifier(PAYMENT_JOB)
Job paymentExecutionJob;
@BeforeEach
void beforeEach() {
jobLauncherTestUtils.setJob(paymentExecutionJob);
}
@Test
public void paymentExecutionJobTest() throws Exception {
// given
JobParameters jobParameters = buildJobParameters();
// when
JobExecution jobExecution = jobLauncherTestUtils.launchJob(jobParameters);
StepExecution stepExecution = jobExecution.getStepExecutions().iterator().next();
// then
TODO. 검증 로직
}
- 많은 게시글에서 @SpringBootTest(classes = Job을 정의한 클래스)를 사용하지만, @Qualifier를 이용하여 Job을 주입받은 뒤, jobLauncherTestUtils.setJob(원하는 Job)을 이용하여 jobLauncherTestUtils에서 launchJob을 할 수 있도록 하는 것이 더 간단하다고 생각하여 @Qualifier를 이용하도록 구현하였다.
- 해당 방식을 사용하면 많은 Job들을 다른 클래스로 분리할 필요 없이 하나의 클래스에 모아두어도 된다는 장점이 있다.
적절하게 구현한다면 테스트 코드는 문제없이 작동할 것이다. 참고로 테스트 내용은 아래와 같다.
- DeletionExecutionJobTest: 회원 탈퇴 결제 Job 테스트
- BatchControllerTest: 재결제 Controller 테스트
- AutomaticPaymentExecutionJobTest: 정기 결제 Job 테스트
- PaymentExecutionJobTest: 결제 Job 테스트
이러한 방식으로 Spring Batch 5 환경에서 테스트 코드를 작성하면 효율적이고 일관된 테스트를 수행할 수 있다.