はじめに。やりたいこと
- 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 でテストできることを確認する。
mkdir testJavaWithSpock cd testJavaWithSpock gradle init --type java-application --test-framework spock
- java-application 部分を削除
- ユニットテストに関係ない dependencies を削除
/* * 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
- ホームディレクトリの取得方法
を見ながら、次のコードを追加しました。
String userHome = System.getProperty("user.home") sourceSets { main { java { srcDirs = [userHome + '/commons-lang/src/main/java'] } } }
次に、App.java を上記で設定した srcDirs に移動します。ユニットテストが通るか確認したいからです。
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 に追加しました。
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件の返信
ありがとうございました。正にこれを探していました!