以前Android Mockを泣きそうになりながら動かしてみたんですが、@ITの記事を書いた方のブログを見つけました。
[参考]
・MockitoをAndroidテストプロジェクトで使用する #android_tec - やらなイカ?
http://nowsprinting.hatenablog.com/entry/2012/12/01/091916
・Androidでmockitoを使ったJUnitの単体テストを動かす #Java #Android - Qiita
http://qiita.com/items/c695e59c2220670ebe04
[環境]
※”Add JARs..ボタンで追加”とありますが、そもそもそうしようと思ったらlibsフォルダに入ってる前提ということでしょうか?そこを外部jarの追加でOKだと勘違いしてしまってたのが原因でした。ちなみに外部jarで追加するとこのようなエラーが出ます
確認のソースコードについては、参考サイトに上げてるQiitaのページにあるソースで確認すれば良いと思います。そのソースコードは、ArrayListのtoStringの戻り値を差し替えています。
紹介されているソースで例えば、
のように、hogeに値を追加しても、hoge.size()の戻り値は0で他のメソッドは機能していません。これが戻り値の型がStringなどの場合はnullが返ってきます。toStringだけの戻り値を差し替えたい場合は、spyを使います。
のようにすれば、変更されているのはtoStringの戻り値だけです。こんな使い方ができるspyが重宝すると思われます。
上記ではJarファイルをlibsフォルダに入れておくだけと記述してますが、Build Pathの設定からAdd JARsボタン押下でmockito-all-1.9.5.jarを追加しておく必要があります。
関連:試行錯誤ログ: Android Test ProjectでJUnit Testが起動しない
PR:JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)
PR:テスト駆動開発入門
・さようならAndroid Mock #android_tec - やらなイカ?お蔵入りのようなことが書いてあり、またMockitoがAndroidネイティブサポートを正式にマージしたとのことやネットで感触が良いような記事を目にしたので今度はMockito動かしてみたいと思います。僕のやり方がマズいのかまたもや躓いたので、やり方をメモしておきたいと思います。
http://nowsprinting.hatenablog.com/entry/2012/11/26/130050
Android Mockは3年前、4週間のプロジェクトとして(より自然なソリューションが出てくるまでの)応急的ソリューションとして開発された....
[参考]
・MockitoをAndroidテストプロジェクトで使用する #android_tec - やらなイカ?
http://nowsprinting.hatenablog.com/entry/2012/12/01/091916
・Androidでmockitoを使ったJUnitの単体テストを動かす #Java #Android - Qiita
http://qiita.com/items/c695e59c2220670ebe04
[環境]
- Eclipse:Helios Service Release 2
- Android Development Tools: 21.0.0.v201210310015-519525
- OS:Win7
[手順]
- Downloads - mockito - simpler & better mocking - Google Project Hosting からmockito-all-1.9.5.jarをダウンロード
- Downloads - dexmaker - Programmatic code generation for Android. - Google Project Hostingからdexmaker-mockito-1.0.jarとdexmaker-1.0.jarをダウンロード
- テストプロジェクトのlibsフォルダに上記jarファイルをすべて突っ込む
※”Add JARs..ボタンで追加”とありますが、そもそもそうしようと思ったらlibsフォルダに入ってる前提ということでしょうか?そこを外部jarの追加でOKだと勘違いしてしまってたのが原因でした。ちなみに外部jarで追加するとこのようなエラーが出ます
java.lang.NoClassDefFoundError: org.mockito.Mockito
at com.example.hoge.test.FirstTest.testHoge(FirstTest.java:15)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214)
at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:199)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:537)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1551)
確認のソースコードについては、参考サイトに上げてるQiitaのページにあるソースで確認すれば良いと思います。そのソースコードは、ArrayListのtoStringの戻り値を差し替えています。
紹介されているソースで例えば、
ArrayList hoge = mock(ArrayList.class); when(hoge.toString()).thenReturn("hoge"); assertEquals ( "hoge", hoge.toString() ); hoge.add("moge"); assertEquals(0, hoge.size());
のように、hogeに値を追加しても、hoge.size()の戻り値は0で他のメソッドは機能していません。これが戻り値の型がStringなどの場合はnullが返ってきます。toStringだけの戻り値を差し替えたい場合は、spyを使います。
ArrayList hoge2 = spy(new ArrayList()); when(hoge2.toString()).thenReturn("hoge"); assertEquals ( "hoge", hoge2.toString() ); hoge2.add("moge"); assertEquals(1, hoge2.size());
のようにすれば、変更されているのはtoStringの戻り値だけです。こんな使い方ができるspyが重宝すると思われます。
追記:2013/06/30 JUnit Testで実行する場合
Android JUnit Testではなく、JUnit Testでロジックテストするなどの場合は、上記ではJarファイルをlibsフォルダに入れておくだけと記述してますが、Build Pathの設定からAdd JARsボタン押下でmockito-all-1.9.5.jarを追加しておく必要があります。
関連:試行錯誤ログ: Android Test ProjectでJUnit Testが起動しない
PR:JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)
PR:テスト駆動開発入門
コメント
コメントを投稿