testFixturesでテスト用のユーティリティを共有する

324
NO IMAGE

過去のバージョンのeclipseではクラスパスの扱いに少々難があり、gradleでimplementationでプロジェクトを参照した場合にtest配下のコードを参照できてしまっていた。(eclipse上でのみ。gradleでビルドするとエラー。)

例えば以下のようなマルチプロジェクトで、project1をproject2からimplementation project(':project1')などと参照しても、本来はmainのソースしか参照できないはずだが、これがeclipse上では参照できてしまうので、うっかりテスト用のユーティリティを他で参照する事が時折起こっていた。CIを回しているプロジェクトであればそこで気が付くが、CIでテストを行うに至っておらず、各自の環境で単体テストのみの状態では結構見過ごされていた。(※そもそもそれ自体が非常によろしくない事だがここでは一旦置いておく。)

project1/
    src/main/java
    src/test/java

project2/
    src/main/java
    src/test/java

これが新しいバージョンのeclipseではクラスパスの扱いが正しくなったのか、implementationで参照できなくなったので、これを機に正しいやり方に改めることにした。

これを解決するには、testFixturesを使えばよいようだ。

使い方は以下の通り。

  • build.gradleのpluginにid 'java-test-fixtures'を追加。
  • sourceSetsのtestFixturesに共有したいテスト用のユーティリティなどを置く。
  • 参照する側はtestFixtures(project(":project1"))のようにdependenciesに書く。