DIが普通になった時代のモックツールはMockitoで決まりですね

in  Java

ここ2,3年、お仕事ではmockitoが鉄板のモックツールになっています。

4年くらい前にはjMock とかはEasymock とかを試してたけど、mockitoの使いやすさには敵わない感があります。

モック対象のクラスにインターフェースがなくても簡単にモック化できるのがお手軽なところ。 最近ではDIを使うことがごく普通になりましたが、インジェクションされるオブジェクトがインターフェースを持たないことが多くなりました。 モック化されるオブジェクトはDIされているオブジェクトであることがおおいので、DIと親和性があることは使いやすさに直結しますね。

Mavenを使っている場合はpom.xmlの設定は下記のようにすればよいです。

1
2
3
4
5
6
<dependency>
       <groupId>org.mockito</groupId>
       <artifactId>mockito-all</artifactId>
       <version>1.9.5</version>
       <scope>test</scope>
</dependency>

フィールドインジェクションしている時のモック化

まずはフィールドインジェクションの場合。 例えば以下のようなテスト対象があるとします。 よくあるアノテーションベースでインスタンスをインジェクションするようなソースです。 CommentDaoのインスタンスがフィールドインジェクションされています。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
public class CommentService {
    @Inject
    private CommentDao commentDao;

    /**
     * データを再読み込みする。
     */
    public void refleshData() {
        commentDao.loadData();
    }
}

テストコードは下記のようになります。 テスト対象と同じフィールドシグネチャーでテストクラスに記述し、@Mockアノテーションをつけます。 これだけでフィールドに宣言されたクラス(CommentDaoクラス)をモック化できます。

テスト対象のクラスには@InjectMocksアノテーションを付与し、 setupメソッドでMockitoAnnotations.initMocks(this)を実行しておきます。 これだけでモックオブジェクトがテスト対象のクラスにインジェクションされます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
public class CommentServiceTest {
    @Mock
    private CommentDao commentDao;
    @InjectMocks
    private CommentService commentService;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void verifyDaoCall() {
        commentService.refleshData();
        verify(commentDao, times(1)).loadData();
    }

}

フィールドインジェクションでがしがし実装しているのと同じ感覚で、テストクラスをかけるのが非常にリズムがいいですね。

コンストラクタインジェクションしている時のモック化

モック対象のクラスがコンストラクタインジェクションされている場合は下記のように作ることもできます。

1
commentDao = mock(CommentDao.class);

このインスタンスをコンストラクタの引数に渡してnewしちゃえばいい訳です。


Share