概要
mockitoで単体テストをMockする
詳細
mockitoで単体テストをMockします。
業務ではdjUnitしか使って居なかったのですが、djUnitのMock機能は
メソッドを文字列で指定するためリファクタリング対象外になる、という欠点があります。
メソッドのリファクタリングなどはよく行う機会が多く、
特にユーティリティ系の用に大量に利用されるコードをモック指定た場合に
リファクタリングの工数がかなり膨らんでしまいます。
導入手順
・下記URLからjarをダウンロード
https://code.google.com/p/mockito/downloads/list
・対象プロジェクトのビルドバスにjarを追加
サンプルコードリファクタリング前
Chickenクラス
package mockito; public class Chicken { public String cry() { return "cock-a-doodle-doo"; } public String cryThreeTimes() { return cry() + "," + cry() + "," + cry(); } }
ChickenTestクラス
package mockito; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import static org.mockito.Mockito.*; import org.junit.Test; public class ChickenTest { private static final String CHIKEN_CROW_JA = "コケコッコー"; @Test public void testCryThreeTimes() { // クラスごとMockしたい場合はmockメソッドを利用する Chicken mock = mock(Chicken.class); when(mock.cry()).thenReturn(CHIKEN_CROW_JA); String cry = mock.cry(); assertThat(cry, is(CHIKEN_CROW_JA)); // 特定のメソッドのみをMockしたい場合はspyメソッドを利用する Chicken chichen = spy(new Chicken()); when(chichen.cry()).thenReturn(CHIKEN_CROW_JA); String cryThreeTimes = chichen.cryThreeTimes(); assertThat(cryThreeTimes, is(CHIKEN_CROW_JA + "," + CHIKEN_CROW_JA + "," + CHIKEN_CROW_JA)); } }
サンプルコードリファクタリング後
Eclipseのリファクタリングメニューのみでメソッド名変更のリファクタリングを実施。
鶏が鳴く、はcryではなくcrowなのでcrowに変更。
djUnitの場合は、テストクラスの文字列指定部をテキスト置換で修正する必要がある。
package mockito; public class Chicken { public String crow() { return "cock-a-doodle-doo"; } public String crowThreeTimes() { return crow() + "," + crow() + "," + crow(); } }
import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import static org.mockito.Mockito.*; import org.junit.Test; public class ChickenTest { private static final String CHIKEN_CROW_JA = "コケコッコー"; @Test public void testCrowThreeTimes() { // クラスごとMockしたい場合はmockメソッドを利用する Chicken mock = mock(Chicken.class); when(mock.crow()).thenReturn(CHIKEN_CROW_JA); String cry = mock.crow(); assertThat(cry, is(CHIKEN_CROW_JA)); // 特定のメソッドのみをMockしたい場合はspyメソッドを利用する Chicken chichen = spy(new Chicken()); when(chichen.crow()).thenReturn(CHIKEN_CROW_JA); String cryThreeTimes = chichen.crowThreeTimes(); assertThat(cryThreeTimes, is(CHIKEN_CROW_JA + "," + CHIKEN_CROW_JA + "," + CHIKEN_CROW_JA)); } }