SpringBatchの公式ドキュメントを参考して、JunitでSpringBatchのテストをやって見たが、Step構成ファイルがjavaファイルで書いた場合、「@ContextConfiguration」でStep構成ファイルを指定するとエラーがいろいろ出ました。
解決方法を調べたが、Step構成ファイルの作成がいくつ注意点があることがわかりました。
サンプルコード
Configuration.java
@Configuration
@EnableBatchProcessing
//注意点1:@ComponentScanを追加し、全プロジェクトのBeanをスキャンすること
@ComponentScan("com.example.パス")
public class Configuration{
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Autowired
private Step010 step010;
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.tasklet(step010)
.build();
}
@Bean
//注意点2:@QualifierでBeanを強く特定すること
public Job job(@Qualifier("step1") Step step1) throws Exception {
return this.jobBuilderFactory.get("job")
.start(step1)
.build();
}
}
SpringBatchApplicationTests.java
@SpringBatchTest
@RunWith(SpringRunner.class)
//注意点3:@ContextConfigurationではBeanをうまく特定できないそうで、@SpringBootTestを使う
@SpringBootTest(classes = { Configuration.class })
public class SpringBatchApplicationTests {
@Autowired
private JobLauncherTestUtils jobLauncherTestUtils;
// Jobテスト
@Test
public void testJob() throws Exception {
// launchJobでJob全体を実行する
JobExecution jobExecution = this.jobLauncherTestUtils.launchJob();
//実行結果と予想値と比較
Assert.assertEquals("COMPLETED", jobExecution.getExitStatus().getExitCode());
}
// Stepテスト
@Test
public void testStep1() throws Exception {
// テストしたいStep名を引数に指定する、Step名は@Qualifierで指定したStep名と一致すること
JobExecution jobExecution = this.jobLauncherTestUtils.launchStep("step1");
Assert.assertEquals("COMPLETED", jobExecution.getExitStatus().getExitCode());
}
}