概要
- Guavaには、@VisibleForTestingというアノテーションが用意されている
- テストコードを書くために、やむを得ずメソッドやメンバーの可視性を上げる必要があるときに付与する
- 「テストコードのために可視性を上げている」ことを示すための目印になる
サンプルコード
import com.google.common.annotations.VisibleForTesting;
public class Sample {
@VisibleForTesting
String load() {
// 省略
}
}
詳しい利用例は、単体テストを書くためにstaticメソッドから脱却しよう #1 原則・ラップメソッドで解説している。
@VisibleForTestingを付与するメリット
可視性を上げている理由を示す目印になる
「テストコードのために可視性を上げている」ことを示すための目印にすることができる。
アノテーション単独では特別な働きをすることはなく、単なる目印である(マーカーアノテーションと呼ばれる)。
静的解析で誤りをチェックすることができる
たとえば、静的解析ツールの一つであるSonarQubeには、@VisibleForTesting
を付与されたメンバやメソッドが、誤って(テストコード以外の)他のクラスのコードからアクセスされていないかをチェックするルールが存在している。このルールを利用することで、意図しない動作を早期に検知することができる可能性がある。
注意点
JavaDocにある通り、本来はアクセス範囲をprivateからデフォルト(パッケージプライベート)に変更するために用いられる。単体テストを書くだけであればデフォルトで十分であり、publicやprotectedに変更するのは悪い設計である。
なお、VisibleForTesting plugin for SonarQubeでは、誤ったアクセス修飾子が付与されていないかをチェックできる。
※追記:バージョンが古く、正常に動作しない模様。フォークされた版では、SonarQube 8.9での動作を確認済み。
その他の @VisibleForTesting
アノテーション
他のライブラリ・APIにも、類似のアノテーションが存在するものがある。
ライブラリ・API | 完全修飾クラス名 |
---|---|
AssertJ | org.assertj.core.util.VisibleForTesting |
Android | androidx.annotation.VisibleForTesting |
Apache Flink | org.apache.flink.annotation.VisibleForTesting |