1. ホーム
  2. android

[解決済み] Android Studioのユニットテスト: データ(入力)ファイルの読み込み

2022-05-17 09:29:12

質問

ユニットテストにおいて、パスをハードコードすることなく、(デスクトップの)ファイルシステム上のjsonファイルからデータを読み取るにはどうすればよいでしょうか。

私は、静的な文字列を作成する代わりに、ファイルから(私の解析メソッドのための)テストの入力を読みたいと思います。

ファイルは私のユニットテストコードと同じ場所にありますが、必要であればプロジェクト内の他の場所に配置することも可能です。私は Android Studio を使用しています。

どのように解決するのですか?

によって android-gradle-plugin のバージョンに依存します。

1. バージョン 1.5 以降。

json ファイルを src/test/resources/test.json として参照し

classLoader.getResource("test.json"). 

gradleの修正は必要ありません。

2.バージョン1.5以下 : (または、何らかの理由で上記の解決策がうまくいかない場合)

  1. 少なくとも Android Gradle プラグイン バージョン 1.1 以上を使用していること。 . リンク先でAndroid Studioを正しくセットアップしてください。

  2. 作成する test ディレクトリを作成します。ユニットテストクラスを java ディレクトリに置き、リソースファイルは res ディレクトリに置きます。Android Studioでは、以下のようにマークされるはずです。

  3. 作成 gradle タスクを作って、リソースをclassesディレクトリにコピーして classloader :

    android{
       ...
    }
    
    task copyResDirectoryToClasses(type: Copy){
        from "${projectDir}/src/test/res"
        into "${buildDir}/intermediates/classes/test/debug/res"
    }
    
    assembleDebug.dependsOn(copyResDirectoryToClasses)
    
    
  4. これで、このメソッドを使って File の参照をファイルリソースから取得します。

    private static File getFileFromPath(Object obj, String fileName) {
        ClassLoader classLoader = obj.getClass().getClassLoader();
        URL resource = classLoader.getResource(fileName);
        return new File(resource.getPath());
    }
    
    @Test
    public void fileObjectShouldNotBeNull() throws Exception {
        File file = getFileFromPath(this, "res/test.json");
        assertThat(file, notNullValue());
    }
    
    
  5. によるユニットテストの実行 Ctrl + シフト + F10 クラス全体、または特定のテストメソッドについて。