【Gradle】外部の Java コードを Spock を使ってテストする環境を整える。

スポンサードリンク

はじめに。やりたいこと

  • 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 をビルドするのが今の目的とします。

参考ページ

を見ながら、次のコードを追加しました。

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 メソッドも含めて細かくユニットテストを回していきたいな、、、という時に、今回のノウハウが役に立ちます♪

以上です。


スポンサードリンク

コメントを残す