mavenプロジェクトでJUnitとSpockを実行する
背景
- 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に依存関係を追加
123456<dependency><groupId>org.spockframework</groupId><artifactId>spock-core</artifactId><version>1.3-groovy-2.5</version><scope>test</scope></dependency> -
テストを書く
12345678910package jp.co.trechimport spock.lang.*class AppSpec extends Specification {def 'サンプルテスト'() {expect:Math.max(1, 2) != 2 // テスト実行されているか確認したいので、あえて落ちるテストにしておく}} -
テスト実行してみる
12./mvnw test→ BUILD SUCCESS→ compileされたファイルが生成されない & Spockも実行されていない
mavenでgroovyファイルをコンパイル対象にする
-
gradleではspockを依存関係に入れるだけでgroovyファイルもコンパイルしてくれていたが、mavenではコンパイルしてくれなかったので以下を追加
※ maven-compiler-pluginは3.6.2以上じゃないと動かない模様(Groovy Eclipse Maven plugin参照)123456789101112131415161718192021222324252627282930313233343536373839<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> -
テスト実行してみる
12./mvnw test→ BUILD SUCCESS→ compileされたファイルが生成された!
→ だがSpockは実行されない
mavenで*Spec.ファイルをテスト実行対象にする
-
上記maven-compiler-pluginの次に以下を追加
123456789101112131415161718<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参照
-
テスト実行してみる
12./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