スキップしてメイン コンテンツに移動

AndroidのテストをMockitoで

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

コメント

このブログの人気の投稿

Javaでprivateなfieldやmethodにアクセスする

JUnitでテストしてると、privateなフィールドにアクセスして、値を参照したりセットしたりしたくなるわけですが、よく使うのでメモしておきます。 例えば、次のような対象のクラスがあるとします。 public class ParentClass { private String hoge = "ParentClass!!"; public void dispMsg() { System.out.println("dispMsg:" + hoge); } private void privateDispMsg(String msg) { System.out.println("dispMsg:" + msg); } }

GolangでWindows GUIアプリケーション

GUIアプリ作成の前提 社内ツールとしてexeで配布 開発環境はGoLandを使う 社内ツールとしてexeを配布ということであれば、Visual StudioでC#による開発だと思います。しかしながら、Go言語を習得したいのと、GoLandの補完機能が便利で、Android Studio使っていたこともあり、とっつきやすいという点からGo縛りでGUIアプリケーションを考えたいと思います。 lxn/walk Windows application library kit for Go. Windows向けしか考えていないので、まずこのライブラリなのですが、ボタンやコンボボックスが思ったように並ばなかったり、手軽にイメージボタンを配置したりなど、簡単にレイアウトを変更できない課題に直面しました。レイアウト作成だけで時間を取られてしまいます。そう言えば、Androidアプリ開発のときは、XMLでデザイン部分を切り離してたのを思い出して、今回の調査の運びとなりました。 fyne-io/fyne Cross platform native GUIs designed for Go based on Material Design. Supports: Linux, macOS, Windows, BSD, iOS and Android. walkと比べると、クロスプラットフォームで作成できるのですが、こちらもコードの中にデザインを書いていく形でした。 therecipe/qt therecipe/qt allows you to write Qt applications entirely in Go or JavaScript. Qt Creatorなるものがあるようで、デザイン部分を切り離せる印象はあるものの、最新のPCでもビルドに時間がかかるようで、学習コストもかかるという記事を見かけて断念しました。 どうしたものかとツイートしましたら、下記のようにご助言をいただいた。 同じ課題に対し色々試した結果、PWAのフルキャッシュドに落ち着いた。中身はGo+WASMで。 https://t.co/e60whDTV16 — のぼのぼ📡 (@nobonobo) July 21, 2020 PWA 早速調べてみました。Googleが進めているプロジェクトで、ネイティブアプリのよ

Eclipseの高速化メモ

Eclipseが重いと一言に言っても、いろいろな工程での話があると思いますが、過去記事のなども含めてこの記事にピックアップしておきたいと思います。以下はWindows環境での話です。