ここ2,3年、お仕事ではmockitoが鉄板のモックツールになっています。
4年くらい前にはjMock とかはEasymock とかを試してたけど、mockitoの使いやすさには敵わない感があります。
モック対象のクラスにインターフェースがなくても簡単にモック化できるのがお手軽なところ。 最近ではDIを使うことがごく普通になりましたが、インジェクションされるオブジェクトがインターフェースを持たないことが多くなりました。 モック化されるオブジェクトはDIされているオブジェクトであることがおおいので、DIと親和性があることは使いやすさに直結しますね。
Mavenを使っている場合はpom.xmlの設定は下記のようにすればよいです。
|
|
フィールドインジェクションしている時のモック化
まずはフィールドインジェクションの場合。 例えば以下のようなテスト対象があるとします。 よくあるアノテーションベースでインスタンスをインジェクションするようなソースです。 CommentDaoのインスタンスがフィールドインジェクションされています。
|
|
テストコードは下記のようになります。 テスト対象と同じフィールドシグネチャーでテストクラスに記述し、@Mockアノテーションをつけます。 これだけでフィールドに宣言されたクラス(CommentDaoクラス)をモック化できます。
テスト対象のクラスには@InjectMocksアノテーションを付与し、 setupメソッドでMockitoAnnotations.initMocks(this)を実行しておきます。 これだけでモックオブジェクトがテスト対象のクラスにインジェクションされます。
|
|
フィールドインジェクションでがしがし実装しているのと同じ感覚で、テストクラスをかけるのが非常にリズムがいいですね。
コンストラクタインジェクションしている時のモック化
モック対象のクラスがコンストラクタインジェクションされている場合は下記のように作ることもできます。
|
|
このインスタンスをコンストラクタの引数に渡してnewしちゃえばいい訳です。