8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Java: Guavaの@VisibleForTestingとは何か

Last updated at Posted at 2020-11-07

概要

  • Guavaには、@VisibleForTestingというアノテーションが用意されている
  • テストコードを書くために、やむを得ずメソッドやメンバーの可視性を上げる必要があるときに付与する
  • 「テストコードのために可視性を上げている」ことを示すための目印になる

サンプルコード

import com.google.common.annotations.VisibleForTesting;

public class Sample {

    @VisibleForTesting
    String load() {
        // 省略
    }

}

詳しい利用例は、単体テストを書くためにstaticメソッドから脱却しよう #1 原則・ラップメソッドで解説している。

@VisibleForTestingを付与するメリット

可視性を上げている理由を示す目印になる

「テストコードのために可視性を上げている」ことを示すための目印にすることができる。
アノテーション単独では特別な働きをすることはなく、単なる目印である(マーカーアノテーションと呼ばれる)。

静的解析で誤りをチェックすることができる

たとえば、静的解析ツールの一つであるSonarQubeには、@VisibleForTesting を付与されたメンバやメソッドが、誤って(テストコード以外の)他のクラスのコードからアクセスされていないかをチェックするルールが存在している。このルールを利用することで、意図しない動作を早期に検知することができる可能性がある。

Rule S5803: Class members annotated with @VisibleForTesting should not be accessed from production code

注意点

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

参考URL

8
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?