【TERASOLUNA BatchでUT】STSにgroovy、spock導入～テスト実行

# 環境
terasolunabatch 5.1.1
STS 3.8.2 64bit
maven 3.6.1
jdk 1.8.0_201

# STSにgroovy-eclipseを追加
https://github.com/groovy/groovy-eclipse/wiki

* STSで使われているeclipseのバージョンに合ったものを追加する。（今回は4.6(Neon)を使用）<br>
* 追加したら、STSを再起動する。<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424166/f60455bc-2c13-3858-84e1-9ced1e1ad0f4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424166/54980d1e-37da-69a9-dbcb-ac6a961fea4e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424166/dd9a6d63-c525-5ae6-7d36-56090ad4a9b0.png)

# groovy projectにconvert
* プロジェクトルートから「構成」→「Convert to Groovy Project」を選択する。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424166/1c9b4938-a46f-ff11-9b33-2ac3a2ff9e9b.png)

* 下記競合の問題があるため、convertが完了したらプロジェクトルートの「Groovy」→「Remove Groovy libraries from classpath」を選択する。<br>
> クラスパスに Maven で取得した Groovy と、プラグインで追加される Groovy でライブラリ競合を起こすので、プラグイン側の Groovy を除去してしまう。
> (引用元：http://yo1000.hateblo.jp/entry/2015/07/13/202753)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424166/290e137d-fb4b-e2e0-0935-3f92579c283e.png)

# pom.xmlを編集
\<dependencies>～\</dependencies>に「spring-batch-test」「spock-core」「spock-spring」追記

```
	<dependency>
		<groupId>org.springframework.batch</groupId>
		<artifactId>spring-batch-test</artifactId>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>org.spockframework</groupId>
		<artifactId>spock-core</artifactId>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>org.spockframework</groupId>
		<artifactId>spock-spring</artifactId>
		<scope>test</scope>
	</dependency>
```
\<build>\<plugins>～\</plugins>\</build>に「gmavenplus-plugin」追記

```
	<plugin>
	    <groupId>org.codehaus.gmavenplus</groupId>
	    <artifactId>gmavenplus-plugin</artifactId>
	    <version>1.7.1</version>
	</plugin>
```

# 動作確認
/src/main/java/EmployeeProcessor.java

```
@Component
@Scope("step")
public class EmployeeProcessor implements ItemProcessor<Employee, Employee> {
    @Value("#{jobParameters[param1]}")
    private String param1;

    @Override
    public Employee process(Employee item) {
        item.setEmpName(item.getEmpName() + "_" + param1);
        return item;
    }
}
```

/src/test/groovy/EmployeeProcessorTest.groovy

```
@ContextConfiguration(locations = "classpath:job01.xml")
@Scope("step")
@Unroll
public class EmployeeProcessorTest extends Specification {
    // ジョブIDを指定
    @Inject
    @Qualifier(value = "job01")
    Job job
    @Inject
    JobRepository jobRepository
    @Inject
    JobLauncher jobLauncher
    
    JobLauncherTestUtils jobLauncherTestUtils
    
    def setup() {
        jobLauncherTestUtils = new JobLauncherTestUtils()
        jobLauncherTestUtils.setJob(job)
        jobLauncherTestUtils.setJobRepository(jobRepository)
        jobLauncherTestUtils.setJobLauncher(jobLauncher)
    }
    
    def empTest() {
        setup:
            // ジョブパラメータの設定
            // SpringBatchでは同一パラメータでジョブを起動するとエラーとなるので、"jsr_batch_run_id"に一意となる値を設定している。
            // （TERASOLUNA Batchではジョブ起動時に自動で一意となる値を設定してくれますが、テスト実行する場合は手動で設定しておきます。）
            JobParameters param = new JobParametersBuilder().addString("param1", "paramTest")
                                                            .addString("jsr_batch_run_id", System.currentTimeMillis().toString())
                                                            .toJobParameters()

        expect:
            // ジョブを実行（ジョブパラメータのみ引数に渡す）
            //JobExecution jobExecution = jobLauncherTestUtils.launchJob(param)
            // ステップを実行（ステップID、パラメータを引数に渡す）
            JobExecution jobExecution = jobLauncherTestUtils.launchStep("job01.step01",param)
            jobExecution.getExitStatus().getExitCode() == "COMPLETED"
    }
}
```
* ジョブID、ステップIDはジョブ定義ファイル内のものを設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424166/44d80ca7-d6d6-de7f-ed76-cad5227ea05e.png)

* テストで使用するジョブ定義ファイルを/src/main/resources/META-INF/jobs/内からコピーしておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424166/8aca48e0-b7d3-4bee-0520-62a9ece0c6f4.png)

* テストを実行する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424166/14d8da33-5d30-41de-2bdc-ffe51d3a149b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424166/32f3eb9f-65d2-8716-c08e-2dbab0ffe430.png)

* 参考にさせて頂いたサイト<br>
http://yo1000.hateblo.jp/entry/2015/07/13/202753<br>
https://qiita.com/euno7/items/1e834d3d58da3e659f92<br>
https://stackoverflow.com/questions/34217101/spring-batch-junit-test-for-multiple-jobs