Hatena::ブログ(Diary)

_development, RSSフィード Twitter

2010-09-04

Android JUnit Testでhamcrestをつかう

JUnit3ェ

AndroidJUnit TestはJUnit3なので、hamcrestが標準では使えません。

hamcrestはテストのための拡張可能なマッチャーライブラリで、文芸的な記述をもちいてAssertを行うことができます。


変数actualの内容が"hoge"であることをAssertするコードはこんな感じです。

    public void testHogeIsJustice() {
        String actual = "hoge";
        assertThat(actual, is(equalTo("hoge")));
    }

"foo"とは違うのだよ"foo"とは、と言いたければこんな感じです。

(is,not,equalToのチェーンは冗長で、not,equalToでだいじょうぶです...)

    public void testHogeIsReallyJustice() {
        String actual = "hoge";
        assertThat(actual, is(not(equalTo("foo"))));
    }

このエントリではAndroid JUnit Testでhamcrestを使う方法を説明します。


hamcrestをライブラリに加える

hamcrestは通常のJavaライブラリと同じく、jarファイルとして提供されているのでクラスパスに追加します。

ダウンロードする

以下のhamcrestのライブラリhttp://code.google.com/p/hamcrest/downloads/list:downloadsからDLします。

バージョンは現時点で1.1と1.2がリストされていますが、ここでは1.1を使います。(1.2でも動くと思いますが未確認です)

  • hamcrest-core-1.1.jar
  • hamcrest-integration-1.1.jar
  • hamcrest-library-1.1.jar
プロジェクトに追加する

DLしたら、プロジェクトに適当な適当なディレクトリをつくって、その中にコピーします。

ここではlibディレクトリをプロジェクトのルートに作成しました。

f:id:esmasui:20100905042854p:image

コピーしたらクラスパスに追加します。

プロジェクトのプロパティからJava Build Path > Libraries -> Add JARs... でコピーしたファイルを指定します。

3つとも追加すると以下のスクリーンショットのようになっているはずです。

f:id:esmasui:20100905042855p:image

(Optional)コードインサイトされるようにする

この手順は必須ではありません。

Ctrl+Spaceなどで表示されるコードインサイト(コンテンツアシスト?)の候補にhamcrestのメソッドが含まれるようにします。

ワークスペースプロパティからJava > Editor > Content Assit >Favoritesで以下のクラスを指定します。

  • org.hamcrest.CoreMatchers
  • org.hamcrest.MatcherAssert

指定が終わると以下のスクリーンショットのようになっているはずです。

f:id:esmasui:20100905042856p:image

hamcrestでAssertを書く

上述の手順を経てhamcrestが使えるようになりました。

先のエントリで使用したMyActivityTestのテストメソッドを以下のように書き換えます。

import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
...

    @MediumTest
    public void testShouldBeVvakame() {
        Intent intent = new Intent(context, MyActivity.class);
        MyActivity underTest = startActivity(intent, null, null);
        TextView textHello = (TextView) underTest.findViewById(R.id.text_hello);
        //hamcrestつかった書き方
        assertThat(textHello.getText().toString(), is(equalTo("わかめ")));
    }

実行すると、グリーンのバーが出るのが確認できると思いますん。

f:id:esmasui:20100905042857p:image

エラーになってしまった時のために

本来は上記の手順でよいのですが、現時点ではきっとうまくいきません。

hamcrestのライブラリを追加してビルドした段階で以下のようなエラーが発生すると思います。

Error generating final archive: duplicate entry: LICENSE.txt

これはAndroid SDKがhamcrestをパッケージしようとするときのエラーです。

hamcrestの3つのjarファイルにはすべてLICENSE.txtが含まれていて、それが原因となっているようです。(why?)

仕方がないのでjarファイルに含まれるLICENSE.txtを削除してパッケージングしなおしたものを使うとエラーがなくなります。

LICENSE.txtを削除するには

jarファイルの実態はzipファイルです。

適当なアーカイバを使ってLICENSE.txtを除去するか、解凍してからLICENSE.txtを除去して再度圧縮します。

再度圧縮する場合はディレクトリ階層がズレないように注意しましょう。

  • ◯ /org/hamcrest...
  • × /hamcrest-core-1.1/org/hamcrest...

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/esmasui/20100904/1283628729