Engineer Llfe Dogear

エンジニアリング活動におけるメモやTipsを書くブログ

Android+mockitoの利用時の設定

Androidユニットテストを作成するにあたり、モックのライブラリがないかと探して、mockitoというライブラリが良さそうなので今回導入を行ってみました。Androidで利用する場合に、別のライブラリや設定が必要であったため、その時にハマった点について共有します。 以下の記事を元にしています。

Mockito + Dexmaker on Android - Stack Overflow

mockitoとは?

mockitoとは、Java用のテスト作成時にモックやスタブを作成するためのライブラリです。mockや、spyといったメソッドを利用することで、モックやスタブの生成が可能です。 残念ながら、テスト作成時のprivate メソッドの呼び出しには対応していないため、private メソッドを利用した場合はpowerMockというライブラリを新たに導入すると良いそうです。 powerMockの導入については別の機会に対応したいと思います。

mockitoの導入と設定

Androidでmockitoを利用する場合、mockitoとdexmakerというライブラリを導入する必要があります。 導入手順は以下の通りです。

  1. Downloads - mockito - simpler & better mocking - Google Project Hosting より、最新(現在、1.9.5)のmockitoのjarファイルをダウンロードし、Androidのlibsディレクトリにコピー
  2. Downloads - dexmaker - Programmatic code generation for Android. - Google Project Hostingより、dexmaker-mockito-1.0.jar、dexmaker-1.0.jarをダウンロードし、Androidのlibsディレクトリにコピー
    ここで、mockitoを利用すると 以下のようなエラーで発生する場合があります。
java.lang.IllegalArgumentException: dexcache == null (and no default could be found; consider setting the 'dexmaker.dexcache' system property)
at com.google.dexmaker.DexMaker.generateAndLoad(DexMaker.java:359)
at com.google.dexmaker.stock.ProxyBuilder.buildProxyClass(ProxyBuilder.java:252)
at com.google.dexmaker.mockito.DexmakerMockMaker.createMock(DexmakerMockMaker.java:54)
at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:26)

このエラーを解消するために、以下のような対応を行います。
3. 以下のCustomInstrumentationTestRunnerファイルを作成

public class CustomInstrumentationTestRunner extends InstrumentationTestRunner {

    @Override public void onCreate (final Bundle arguments) {
        super.onCreate(arguments);

        System.setProperty("dexmaker.dexcache", getTargetContext().getCacheDir().toString());
    }
}

CustomInstrumentationTestRunnerは、InstrumentationTestRunnerを継承したクラスです。
システムに、dexmakerキャッシュのディレクトリパスの設定を行います。
4. テストプロジェクトのManifestファイルのInstrumentationにCustomInstrumentationTestRunnerを設定

<instrumentation
    android:name="my.package.CustomInstrumentationTestRunner"
    android:targetPackage="my.target.package" />

テストプロジェクトのデフォルトのInstrumentationの設定をCustomInstrumentationTestRunnerへ変更します。
5. eclipseのconfigureの設定 eclipseのrunning configurationから、Instrumentationとして作成したCustomInstrumentationTestRunnerを利用するよう設定を行います。

以上で設定は完了です。 mockitoを利用したテストの書き方については、以下のサイトが参考になると思います。

Mockito 初めの一歩 - Qiita

Mockitoの真価はspyにあり - R42日記