ASとか

開発系の記事が多めです。タイトルのASはActionScriptの略です。

テスト用プロジェクト内のリソースを参照する方法

はじめに

AndroidTestCaseを継承したクラスでAssets内のファイルを参照しようとしたらエラーになってしまうので解決策をメモ

解決編

AndroidTestCaseにはテスト用のContextを取得するためのAPIはあるようですが、hiddenらしくリフレクションで取得しています。一応、いくつかのクラスでリソースのアクセスを行いたいのでクラスを分けてAndroidTestCaseを外から渡すようにしてみました。ちなみにAndroidTestCase内にこのコードを書く場合には参考URLのようにgetTestContext以外の名前にしないとhiddenであるgetTestContextと名前がかぶっておかしくなります。

public class Utils {

    /**
     * テスト対象プロジェクトのAssetsフォルダを参照する場合はこれを使う
     * @param testCase
     * @return
     */
    public static Context getTestContext(AndroidTestCase testCase) {
        @SuppressWarnings("unchecked")
        Class clz = testCase.getClass();
        Method method;
        try {
            method = clz.getMethod("getTestContext");
            return (Context) method.invoke(testCase);
        } catch (Exception e) {
            return null;
        }
    }

}

// assets内
Utils.getTestContext(this).getAssets().open("json/test.json");

// res内は使わないぽい
getContext().getString(R.string.test)