mavenプロジェクトでJUnitとSpockを実行する

## 背景

- mavenのプロジェクト
- JUnitでわずかながらテストが書かれていた
- JUnitでテストを書き続けるのは辛い
- Spockでテストを書きたい

※ gradleにspock導入経験有り

## 概要、やりたいこと

- 既存のJUnitを残しつつ、Spockも追加していきたい
- JUnitとSpockをひとつのコマンドで一発で実行したい（```./mvnw test```）
- spockがどう素晴らしいかなどは記載しません

って話です。
未だにMavenでJUnitを使ってテストしている人に捧ぐ…


### 環境

- maven3
- java8
- groovy2.5

## 手順

### 流れ

1. とりあえず、spockを追加してテストを書く
1. mavenでgroovyファイルをコンパイル対象にする
1. mavenで**Spec.*ファイルをテスト実行対象にする

### とりあえず、spockを追加してテストを書く
1. pom.xmlに依存関係を追加

    ```xml:pom.xml
    <dependency>
        <groupId>org.spockframework</groupId>
        <artifactId>spock-core</artifactId>
        <version>1.3-groovy-2.5</version>
        <scope>test</scope>
    </dependency>
    ```
1. テストを書く

    ```groovy:AppSpec.groovy
    package jp.co.trech

    import spock.lang.*

    class AppSpec extends Specification {
        def 'サンプルテスト'() {
            expect:
            Math.max(1, 2) != 2 // テスト実行されているか確認したいので、あえて落ちるテストにしておく
        }
    }
    ```
1. テスト実行してみる

    ```bash
    ./mvnw test
    → BUILD SUCCESS
    ```
→ compileされたファイルが生成されない & Spockも実行されていない


### mavenでgroovyファイルをコンパイル対象にする

1. gradleではspockを依存関係に入れるだけでgroovyファイルもコンパイルしてくれていたが、mavenではコンパイルしてくれなかったので以下を追加
※ maven-compiler-pluginは3.6.2以上じゃないと動かない模様（[Groovy Eclipse Maven plugin](https://github.com/groovy/groovy-eclipse/wiki/Groovy-Eclipse-Maven-plugin)参照）

    ```xml:pom.xml
        <build>
            <plugins>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <encoding>UTF-8</encoding>
                        <compilerId>groovy-eclipse-compiler</compilerId>
                        <verbose>true</verbose>
                        <compilerArguments>
                            <indy/><!-- optional; supported by batch 2.4.12-04+ -->
                            <configScript>config.groovy</configScript><!-- optional; supported by batch 2.4.13-02+ -->
                            <!-- consult Lombok docs to confirm agent class name for your version -->
                            <javaAgentClass>lombok.launch.Agent</javaAgentClass>
                        </compilerArguments>
                        <fork>true</fork>
                    </configuration>
                    <dependencies>
                        <dependency>
                            <groupId>org.codehaus.groovy</groupId>
                            <artifactId>groovy-eclipse-compiler</artifactId>
                            <version>3.3.0-01</version>
                        </dependency>
                        <dependency>
                            <groupId>org.codehaus.groovy</groupId>
                            <artifactId>groovy-eclipse-batch</artifactId>
                            <version>2.5.6-01</version>
                        </dependency>
                        <dependency><!-- optional; プロジェクト内でlombokを使っている場合は追加 -->
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>1.16.20</version>
                        </dependency>
                    </dependencies>
                </plugin>
            </plugins>
        </build>
    ```
1. テスト実行してみる

    ```bash
    ./mvnw test
    → BUILD SUCCESS
    ```
→ compileされたファイルが生成された！
→ だがSpockは実行されない

### mavenで**Spec.*ファイルをテスト実行対象にする

1. 上記maven-compiler-pluginの次に以下を追加

    ```xml:pom.xml
        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>3.0.0-M1</version>
            <configuration>
                <failIfNoTests>true</failIfNoTests>
                <includes>
                    <include>**/*Test.*</include>
                    <include>**/*Spec.*</include>
                </includes>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.apache.maven.surefire</groupId>
                    <artifactId>surefire-junit47</artifactId>
                    <version>3.0.0-M1</version>
                </dependency>
            </dependencies>
        </plugin>
    ```
maven-surefire-pluginのversionはjavaのversionによるので、[Maven Surefire Plugin](https://maven.apache.org/surefire/maven-surefire-plugin/index.html)参照
1. テスト実行してみる

    ```bash
    ./mvnw test
    → BUILD FAILURE
    ```
→ compileされたファイルが生成された！
→ Spockも実行されたのでテスト落ちた！

→ Spockのテストを修正してテストが通れば完了！


# 結論

- gradleには簡単にSpock入れられたのにmavenにSpock追加するのは大変
- おとなしくgradle使いましょう

---

# 参考URL

[Compiling Groovy](http://docs.groovy-lang.org/latest/html/documentation/tools-groovyc.html#_maven_integration)
[maven-surefire-plugin Using JUnit](https://maven.apache.org/surefire/maven-surefire-plugin/examples/junit.html)
[groovy/groovy-eclipse Groovy Eclipse Maven plugin](https://github.com/groovy/groovy-eclipse/wiki/Groovy-Eclipse-Maven-plugin)