はじめに。やりたいこと
- PC のあるところに置いてある Java プロジェクトのコードのユニットテストをしたくなった。
- Java のファイルは移動したくない。
- Spock 使いたい。
これを、Gradle を使って解決しましたので流れをノートいたします。
解決ポイント
- Spock なら、Java の private メソッドでもテストできる。
- Gradle プロジェクトのため、build.gralde に Java プロジェクトの場所を書いておけば、Spock のコードは別の場所に置いておくことができる。
- これによって、既存の Java プロジェクトにテストコードを容易に入れられない場合でも、Gradle プロジェクトを別に作ってそこに Spock ユニットテストコードを置いておくことで、既存の Java コードに絡まること無くテストが実施できる。
- Gradle プロジェクトを作る時に、
--test-framework spock
を指定することでテストは Spock を指定できる。 - Gradle プロジェクトを作る時に、
--type java-application
を指定し、build.gradle を編集する。—type java-library
でもよいが、同様に編集する。今回の目的では既存の Java プロジェクトを別途 build.gradle で指定し、Gradle プロジェクト内に Java コードを置かないため、どちらでも build.gradle を編集することになる。
全体に渡っての参考ページ
1. Gradle プロジェクトを作成し、付属のサンプル Java コードが Spock でテストできることを確認する。
1 2 3 | mkdir testJavaWithSpock cd testJavaWithSpock gradle init -- type java-application -- test -framework spock |
- java-application 部分を削除
- ユニットテストに関係ない dependencies を削除
build.gradle 1234567891011121314151617181920212223242526272829/*
* This build file was generated by the Gradle 'init' task.
*
* This generated file contains a sample Java project to get you started.
* For more details take a look at the Java Quickstart chapter in the Gradle
* user guide available at https://docs.gradle.org/4.4.1/userguide/tutorial_java_projects.html
*/
// Apply the java plugin to add support for Java
apply plugin:
'java'
// Apply the groovy plugin to also add support for Groovy (needed for Spock)
apply plugin:
'groovy'
// In this section you declare where to find the dependencies of your project
repositories {
// Use jcenter for resolving your dependencies.
// You can declare any Maven/Ivy/file repository here.
jcenter()
}
dependencies {
// Use the latest Groovy version for Spock testing
testCompile
'org.codehaus.groovy:groovy-all:2.4.12'
// Use the awesome Spock testing and specification framework even with Java
testCompile
'org.spockframework:spock-core:1.0-groovy-2.4'
testCompile
'junit:junit:4.12'
}
この状態で、gradle build
し、BUILD SUCCESSFUL
となることを確認しました♪
2. Gradle プロジェクト外に置いた Java プロジェクトを、Gradle プロジェクトからビルドできることを確認する。
をホームディレクトリに git clone
したもので試すことにしました。
この apache/commons-lang をビルドするのが今の目的とします。
参考ページ
- 48.4.1. Changing the project layout
- ホームディレクトリの取得方法
を見ながら、次のコードを追加しました。
1 2 3 4 5 6 7 8 | String userHome = System.getProperty( "user.home" ) sourceSets { main { java { srcDirs = [userHome + '/commons-lang/src/main/java' ] } } } |
次に、App.java を上記で設定した srcDirs に移動します。ユニットテストが通るか確認したいからです。
1 | mv src /main/java/App .java ~ /commons-lang/src/main/java/App .java` |
これで修正はおしまい。
gradle build
し、BUILD SUCCESSFUL
となることを確認しました♪
3. Gradle プロジェクト外に置いた Java プロジェクトのメソッドを、Spock でテストする。
いよいよ今回の目的のメインです♪
の addAll メソッドをテストしてみます!
ArrayUtilsTest.groovy を src/test/groovy に追加しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import org.apache.commons.lang3.ArrayUtils import spock.lang.Specification class ArrayUtilsTest extends Specification { def "addAll int" () { setup: int [] input = [ 0 ] when: int [] result = ArrayUtils.addAll(input, 1 , 2 ) then: int [] expected = [ 0 , 1 , 2 ] result == expected } } |
gradle build
し、BUILD SUCCESSFUL
となることを確認しました♪
おわりに
ちょっと外から Java コードの private メソッドの動きを確かめたいな、、、Java プロジェクトに単体テストがなく、今後もプロジェクトとして追加される見込みが無いけど、改修するときは private メソッドも含めて細かくユニットテストを回していきたいな、、、という時に、今回のノウハウが役に立ちます♪
以上です。
「【Gradle】外部の Java コードを Spock を使ってテストする環境を整える。」への1件の返信
ありがとうございました。正にこれを探していました!