マイペースなRailsおじさん

Ruby、Ruby on Rails、オブジェクト指向設計を主なテーマとして扱います。だんだん大きくなっていくRuby on Rails製プロダクトのメンテナンス性を損なわない方法を考えたり考えなかったりしている人のブログです。

@Mockでモックを初期化する方法は3つある。

mockitoでは、モックにしたい変数に@Mockアノテーションを付けるだけでモックを作れます。この場合、アノテーションを有効にする記述をする必要があります。アノテーションの有効化は、initMocksを呼び出す、Runnerを使う、Ruleを使うの3つの方法で行えます。

mockito

mockitoはモック作成、呼び出しの検証、スタブの作成が行えるユニットテスト用のJavaライブラリです。
以下は公式サイトにあるキャッチコピー。

Tasty mocking framework for unit tests in Java
Javaユニットテストのための味わい深い(?)モックフレームワーク

インストール

gradleを使っている場合は、build.gradleのdependenciesにmockitoを追加してください。

group 'net.example'
version '1.0-SNAPSHOT'

apply plugin: 'java'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    testCompile group: 'org.mockito', name: 'mockito-core', version: '2.21.0'
}

基本的な使い方

モックにしたクラスのメソッドにスタブを作ってテストするという使い方をよくします。

基本的なモック

mockの作り方

mockを作る方法は、mockメソッドを使う方法と、@Mockアノテーションを使う方法があります。

上の例で使っていたので、mockメソッドを使う方法です。

private List mockedList = mock(List.class);

もう一つが@Mockアノテーションを使う方法です。

@Mock
private List mockedList;

アノテーションを使ったほうが記述が少なく、見栄えもいいのですが注意が必要です。 @Mockに限らず、mockitoが提供しているいくつかのアノテーションを使うときはアノテーションを使ったMockを初期化する処理を書かなければいけません。

アノテーションを使ったmockを初期化する方法

@Mockとかを初期化する方法は3つあります。 私はRunnerを使うのが楽なので好きです。

initMocks()を使う

@Beforeなメソッドの中でinitMocksを使います。

initMocks

Runnerを使う

@RunWith(MockitoJUnitRunner.class)をクラスにつけます。 Mockito用のRunnerが適用されるので、Mockの初期化だけでなくスタブの用法が間違ってないか検証するなどの機能もあります。

Runnerを使う

Ruleを使う

JUnitのRuleを使ってMockitoJUnit用のルールを適用します。

@Rule public MockitoRule rule = MockitoJUnit.rule();

効果としてはRunWithを使った場合と変わらないようです。

Rule

情報源

Mockito (Mockito 2.21.0 API)

https://static.javadoc.io/org.mockito/mockito-core/2.21.0/org/mockito/MockitoAnnotations.html#initMocks-java.lang.Object-

MockitoJUnitRunner (Mockito 2.21.0 API)

https://static.javadoc.io/org.mockito/mockito-core/2.21.0/org/mockito/junit/MockitoRule.html