techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

ContentProviderアクセステスト用ライブラリPantomimeを公開しました

Androidの開発を行うにあたってContentProviderへアクセスする場合にContentProviderの中身が動的に変化する場合にテストを書く場合に同じ環境にならなくてユニットテストが失敗したりすることがあります。

そこで今回作ったPantomimeを紹介します。

Pantomimeの特徴は1回ContentProviderにアクセスした際の情報をファイルに保存し、読み出しモードに切り替えた時にそのデータをそのまま返却することができます。
そのため全く同じ環境にするためにモックの処理を書かずにテストを再現することができます。

使い方

PantomimeはAndroidのContentProviderに保存されているデータにアクセスしたデータをスキミングし保存します。
そして保存したデータをPantomimeモードで実行した時にそのスキミングデータをContentProviderの代わりに返却します。

下記のようにrecordを呼び出すとContentProviderへのアクセス時にデータをスキミングします。

Pantomime.getInstance().record("スキミングデータを保存するディレクトリパス");

止めるには下記のようにstopを呼び出します。

Pantomime.getInstance().stop();

ContentProviderを利用しないでスキミングデータを利用する場合は次のようにします。

Pantomime.getInstance().start("スキミングデータを保存するディレクトリパス");

ContentProviderへqueryでアクセスする場合は次のように実施します。
[例:query]

Pantomime.getInstance().query(
                getContentResolver(),
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                null,
                null,
                null,
                null);

Pantomimeには次のメソッドが用意されています。

Cursor query(ContentResolver resolver, Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder);

アプリのリリースビルドを行うとrecordおよびstartの呼び出しはスキミングおよびパントマイムは行わず、ContentProviderへの直セスアクセスのみの動作になります。

制限事項

申し訳ありませんが下記のAPIは開発中です。
実装していますが動作確認中です。

String getType(ContentResolver resolver, Uri uri);
Uri insert(ContentResolver resolver, Uri uri, ContentValues values);
int delete(ContentResolver resolver, Uri uri, String selection, String[] selectionArgs);
int update(ContentResolver resolver, Uri uri, ContentValues values, String selection, String[] selectionArgs);

ソースコード

github.com

そのうちライブラリの形態で更新したいと思います。