2015年7月29日水曜日

Java の Mockito を使ってみた

概要

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.classjava.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…)
他のライブラリも使って書き方や機能を比較してみるとおもしろいかも
今回

0 件のコメント:

コメントを投稿