背景
- mavenのプロジェクト
- JUnitでわずかながらテストが書かれていた
- JUnitでテストを書き続けるのは辛い
- Spockでテストを書きたい
※ gradleにspock導入経験有り
概要、やりたいこと
- 既存のJUnitを残しつつ、Spockも追加していきたい
- JUnitとSpockをひとつのコマンドで一発で実行したい(
./mvnw test
) - spockがどう素晴らしいかなどは記載しません
って話です。
未だにMavenでJUnitを使ってテストしている人に捧ぐ…
環境
- maven3
- java8
- groovy2.5
手順
流れ
- とりあえず、spockを追加してテストを書く
- mavenでgroovyファイルをコンパイル対象にする
- mavenで**Spec.*ファイルをテスト実行対象にする
とりあえず、spockを追加してテストを書く
-
pom.xmlに依存関係を追加
pom.xml<dependency> <groupId>org.spockframework</groupId> <artifactId>spock-core</artifactId> <version>1.3-groovy-2.5</version> <scope>test</scope> </dependency>
-
テストを書く
AppSpec.groovypackage jp.co.trech import spock.lang.* class AppSpec extends Specification { def 'サンプルテスト'() { expect: Math.max(1, 2) != 2 // テスト実行されているか確認したいので、あえて落ちるテストにしておく } }
-
テスト実行してみる
./mvnw test → BUILD SUCCESS
→ compileされたファイルが生成されない & Spockも実行されていない
mavenでgroovyファイルをコンパイル対象にする
-
gradleではspockを依存関係に入れるだけでgroovyファイルもコンパイルしてくれていたが、mavenではコンパイルしてくれなかったので以下を追加
※ maven-compiler-pluginは3.6.2以上じゃないと動かない模様(Groovy Eclipse Maven plugin参照)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>
-
テスト実行してみる
./mvnw test → BUILD SUCCESS
→ compileされたファイルが生成された!
→ だがSpockは実行されない
mavenで**Spec.*ファイルをテスト実行対象にする
-
上記maven-compiler-pluginの次に以下を追加
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参照
-
テスト実行してみる
./mvnw test → BUILD FAILURE
→ compileされたファイルが生成された!
→ Spockも実行されたのでテスト落ちた!
→ Spockのテストを修正してテストが通れば完了!
結論
- gradleには簡単にSpock入れられたのにmavenにSpock追加するのは大変
- おとなしくgradle使いましょう
参考URL
Compiling Groovy
maven-surefire-plugin Using JUnit
groovy/groovy-eclipse Groovy Eclipse Maven plugin