2012-07-25

[Android]AndroidのユニットテストにMockito使うぜ

できるようになったようなので試してみる。

Mockitoといえば、Javaアプリ開発の中でユニットテストをするときに使用するモックライブラリです。
最近のユニットテストで、比較的よく使われるライブラリかもしれないです。自分もよく使います。

そんなMockitoですが、1.9.5-rc1からこっそりAndroid対応していました。
http://code.google.com/p/mockito/issues/list?can=1&q=label%3AMilestone-Release1.9.5-rc1&colspec=ID+Type+Status+Priority+Milestone+Owner+Summary&cells=tiles

そんなわけなので早速使ってみます。

▲準備
まずライブラリを以下からダウンロードしてきます(Mockitoを使用するにはdexmakerというライブラリも必要)
http://code.google.com/p/mockito/downloads/detail?name=mockito-all-1.9.5-rc1.jar&can=2&q=
http://code.google.com/p/dexmaker/downloads/detail?name=dexmaker-20120622.jar&can=2&q=

次にダウンロードしたライブラリをテストプロジェクトのlibsフォルダに配置しプロジェクトのビルドパスに追加します。

▲Mockitoを使ってテストを書く
お題は以前に実施したMockContextを使ったテストとしましょう

 public String findPackageFromContext(Context context) {
        return context.getPackageName();
    }
Mockitoを使うと以下のようにテストコードが書けます

    public void test2() throws Exception {
        Context mock = Mockito.mock(Context.class);
        Mockito.when(mock.getPackageName()).thenReturn("mockito on Android.");
        Util util = new Util();
        try {
            assertEquals("mockito on Android.", util.findPackageFromContext(mock));
            Mockito.verify(mock, Mockito.times(1)).getPackageName();
        } catch (Exception e) {
            fail(e.getMessage());
        }
    }
このようにMockContextをオーバーライドして書くテストよりもシンプルにテストコードを書くことができます。
因に、以下のようにActivityのようなAndroid特有のクラスもMock化できます(テストコードがあまりよくないの
はご愛嬌ということでw)

    public void test2() throws Exception {
        String expected = "Expected Action";
        Activity mock = Mockito.mock(Activity.class);
        Intent dummy = new Intent(expected);

        Mockito.when(mock.getIntent()).thenReturn(dummy);
        Util util = new Util();
        try {

            assertEquals(expected, util.findPackageFromContext(mock).getAction());
        } catch (Exception e) {
            fail(e.getMessage());
        }
    }
▲使ってみた感想
テストの実行速度が遅い。Android特有のクラスをMock化した場合、1つのテストの実行に5-10sかかります。
Mock化する数が多ければ多いほど、テストにかかる時間が伸びると思います。
MockContextなどAndroidのライブラリに含まれるMockクラスをオーバーライドしてテストを書くとテストの実行は早いです。
コードの可読性か実行速度重視かのトレードオフになるでしょう。
個人的には理解しやすいほうがいいので多少時間がかかってもいいのでMockitoを利用して書いたほうがいいかもしれないですね。

0 件のコメント:

コメントを投稿

Blogger Syntax Highliter