Eclipse:モジュールでテストコード利用の際のエラー

Eclipse:Java9モジュールシステムを使うと共にJUnitを使う方法において、最終的なライブラリにはJUnitへの依存を含めずにユニットテストを行う方法を記述した。

要するに、Eclipseには「本番用」と「テスト用」のコードを分け、それぞれに必要なライブラリを分ける機能があるということだ。

しかし、Eclipse上で不可解なエラーが発生することがある。

問題

例えば、Guiceライブラリを本体の依存として入れる。

dependencies {
  implementation group: 'com.google.inject', name: 'guice', version: '4.2.2'
  testImplementation group: 'junit', name: 'junit', version: '4.12'

この状態でユニットテスト側でGuiceを使うと以下のエラーが表示される。

The package com.google.inject is not accessible

一方で、unitテストの方はエラーが発生していない。

理由

この理由としては、本体側のライブラリとして依存定義したライブラリをユニットテストで使用するためには、module-info.javaにおいてモジュールをrequiresしなければならない。

module testlib {
  requires com.google.guice;
}

仮に本体側でこのライブラリを使用していれば、以下のようにわかりやすいエラーになるのだが、

The import com.google cannot be resolved
...
Add 'requires com.google.guice' to module-info.java

テストコードの方ではこのメッセージが出ないのである。

問題の根源

「本体の方で使うために本体側のライブラリにしたのだろう」というかもしれないが、そうではないのだ。

本体側で使うのはA.jarなので、module-info.javaにはAが記述されているのだが、この依存としてB.jarやC.jarをひきつれてくる。このB.jarやC.jarをユニットテストで使いたいわけだ。

本体側では使わないために、module-info.javaには記述していないのだが、ユニットテスト側で使おうとすると、最初のような、

The package B is not accessible

というような不親切なメッセージしか出ないためになかなか原因がわからないという結果になる。