テスト対象のインスタンスに @InjectMocksをつけると、対象インスタンスのフィルドに@Mockされたインスタンスを差し込むことができる。

1
2
3
4
5
@InjectMocks
Manager manager;

@Mock
Name name; // manager.nameはモックされる

実現方法

InjectMocksのJavadocを読むと、フィルドのinject方法は3つあります。

  1. Constructor injection;
    1つ目はコンストラクターを利用してモックインスタンスを設定する。この方法はデフォルトで引数の数が一番多いコンストラクターを利用する。
    要注意なことは、必要なモックインスタンスが見つからない場合、その引数はnullとなる。
    引数にモックできないタイプ(基本型)がある場合、デフォルトのコンストラクターでInjectMocksのインスタンスを作って別の方法でInjectを実現する。

  2. Property setter injection;
    2つ目はとてもわかりやすくて、フィルドのsetterメソッドを利用して、モックインスタンスを差し込む。
    該当のsetterメソッドを探すとき、まずフィルドのタイプを利用する。同じタイプのフィルドが存在する場合、モックインスタンスの名前を利用する。
    という理由で、モックインスタンスを定義するとき、できる限りInject対象のフィルドと同じ名前にする方がいい。
    Constructor Injectionでデフォルトコンストラクターを利用する場合、モックインスタンスの差し込むはこの方法で実現される。

  3. Field injection;
    フィルドのsetterがない場合、直接設定でInjectを実現する。ルールはProperty setter injectionと同じ。