概要
mockito はJUnit等のユニットテストで使用する Mock オブジェクトを作成するためのライブラリです
例えば外部サービスと接続するアプリでローカルでテストする場合は接続しないでテストしたかったりするケースなんかに使えます
環境
- Mac OX X 10.10.4
- Eclipse Luna 4.4
- Java 1.8.0_31
- Maven 3.2.1
- Mockito 1.10.19
使ってみる
サンプルプロジェクトの作成
EclipseでMavenプロジェクトを作成します
maven-archetype-quickstart
を ArtifactId に選択してプロジェクトを作成しました
本記事中で扱うパッケージは「com.sample.test」としています
Mockito を使ったテストを書いてみる
maven-archetype-quickstart
でプロジェクトを作成すれば「src/main/java/com.sample.test.AppTest.java」があると思うのでそれを使います
pom.xml へライブラリ追加
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.10.19</version>
</dependency>
上記でOKです
使えるようになったら早速試してみます
verify
verify
は作成した Mock オブジェクトが正確に何回動作したかをチェックするための機能です
とりあえず以下がverify
を使ったサンプルコードです
public void testVerify() {
List mockedList = mock(List.class);
mockedList.add("one");
mockedList.clear();
verify(mockedList).add("one");
verify(mockedList).clear();
}
まずはじめに冒頭でimport static org.mockito.Mockito.*;
で書いておくといいと思います
Mockito
クラス配下の static なメソッドを使う機会が
多いためです
mock
メソッドの引数に Mock オブジェクトとして作成したクラスのオブジェクトを渡します
サンプルのList.class
はjava.util.List
の List クラスです
作成した Mock オブジェクトは普通にそのクラスに存在しているメソッドをコールすることができます
作成した Mock オブジェクトに対してadd
, clear
を1回ずつコールします
そしてその後でverify
を使って Mock オブジェクトが正しく動作したかを評価します
verify
の引数に評価したい Mock オブジェクトを指定して、続けて評価したいメソッドをコールします
verify(mockedList).add("one");
こうすることで何が起きているかいうと
mockedList の add メソッドが引数 “one” で1回ちゃんとコールされているか
を評価することができます
なので、例えばverify
する前のadd
で
mockedList.add("two");
こんな感じでコールし直すように変更するとverify
が失敗することが確認できると思います
verify
は引数をもう一つ持つことができて評価する回数を指定することができます
verify(mockedList, times(2)).add("one");
Mock クラスのtimes
というメソッドを使って評価された回数を指定できます
when
when
はある Mock オブジェクトのメソッドがコールされたときにこういう値を返しますという振る舞いを設定することができる機能です
とりあえず以下がwhen
を使ったサンプルコードです
public void testWhen() {
App app = mock(App.class);
when(app.getAppname()).thenReturn("myapp");
System.out.println(app.getAppname());
}
Mock オブジェクトを作成してwhen
メソッドを呼び出します
引数に作成した Mock オブジェクトのあるメソッドを指定します
指定するメソッドは必ず返り値を保つ必要があるためvoid
のメソッドでwhen
を利用することはできません
when
で返り値を設定した場合、Setter などで値を上書きしたと思ってもwhen
で指定した値が取得されます
when(app.getAppname()).thenReturn("myapp");
app.setAppname("hoge");
System.out.println(app.getAppname());
-> myapp が出力される
要するにあるメソッドの戻り値を意図的に設定することができます
他にも Exception を投げたり引数を元に複雑な返り値を設定できるthenAnswer
があります
※参考 : http://docs.mockito.googlecode.com/hg/org/mockito/stubbing/OngoingStubbing.html
最後に
Java の Mock 系のライブラリは他にもいろいろあります (JMock, EasyMock etc…)
他のライブラリも使って書き方や機能を比較してみるとおもしろいかも
今回