Android、Java、Web系、Linux、マラソン等の備忘録

2013/01/07

AndroidのテストをMockitoで

0 件のコメント
以前Android Mockを泣きそうになりながら動かしてみたんですが、@ITの記事を書いた方のブログを見つけました。
・さようならAndroid Mock #android_tec - やらなイカ?
http://nowsprinting.hatenablog.com/entry/2012/11/26/130050
Android Mockは3年前、4週間のプロジェクトとして(より自然なソリューションが出てくるまでの)応急的ソリューションとして開発された....
お蔵入りのようなことが書いてあり、またMockitoがAndroidネイティブサポートを正式にマージしたとのことやネットで感触が良いような記事を目にしたので今度はMockito動かしてみたいと思います。僕のやり方がマズいのかまたもや躓いたので、やり方をメモしておきたいと思います。

[参考]

・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
[手順]
  1. Downloads - mockito - simpler & better mocking - Google Project Hosting からmockito-all-1.9.5.jarをダウンロード
  2. Downloads - dexmaker - Programmatic code generation for Android. - Google Project Hostingからdexmaker-mockito-1.0.jarとdexmaker-1.0.jarをダウンロード
  3. テストプロジェクトのlibsフォルダに上記jarファイルをすべて突っ込む
参考サイトにビルドパスの設定について書かれてたりしますが、libsフォルダにまとめて入れるだけでOKのようです。

※”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:テスト駆動開発入門

0 件のコメント :

コメントを投稿