web-dev-qa-db-ja.com

Android単体テストでテスト専用ファイルを読み取る方法

私のAndroidアプリの場合、いくつかのファイルの読み取りを必要とする単体テストを書いています。これらはテスト専用ファイルであるため、私がresフォルダーに入れたくないので彼らが私の最後に終わることを望まない.apkファイル。

この質問 と同様のことをしたいが、新しく追加された(Gradle 1.1で) 単体テストのサポート (計測テストとは対照的に)を使用したい。

私のプロジェクト構造は次のとおりです。

/app
   /src
      /main
         /Java/my.module/myClass.Java
         /res/production_resources_go_here
      /test
         /Java/my.module/myClassTest.Java
         /resources/testFile.txt

myClassTestテストをtestFile.txt

25

この質問が尋ねられたとき、これは単に機能していませんでした。幸いなことに、これは修正されています。

OPが実行しようとしたように、テキストファイルをapp/src/test/resourcesフォルダーに配置する必要があります。さらに、テストクラスと同じパッケージにある必要があります。したがって、ReadFileTest.Javaフォルダーのパッケージcom.example.testapp/src/test/Javaがある場合、テストファイルはapp/src/test/resources/com/example/testにあるはずです。

test folder structure

次に、次のようにテキストファイルにアクセスできます。

getClass().getResourceAsStream("testFile.txt")

これにより、テキストファイルのInputStreamが開きます。それが何をするのかわからない場合は、これを使用することができる多くの方法のいくつかを次に示します: InputStreamを文字列に読み取り/変換

48

これをbuild.gradleに追加します。

Android {
    sourceSets {
        test {
           resources.srcDirs += ['src/test/resources']
        }
        androidTest {
           resources.srcDirs += ['src/androidTest/resources']
        }
    }
}

ユニットテストでリソースにアクセスできるようにするには、src/test/resourcesにファイルを追加します。インストルメンテーションテストの場合は、src/androidTest/resourcesにファイルを追加します。

10
Deepanshu

私はあなたが言ったのと同じような構造でプロジェクトを進めています。私はすべてのサーバー応答をresourcesフォルダーの下のapp/src/test/resources/BookingInfo.jsonのようなファイルに入れました。

すべてのJavaテストファイルは、あなたが言ったのと同じようにapp/src/test/Java/PACKAGE_NAMEの下にあります。リソース名を含むパッケージの下にFixtureクラスがあります。

@SuppressWarnings("nls")
public final class Fixtures
{
    public static final String GET_ANNOUNCEMENT = "GetAnnouncement.json";
...
}

最後に、このクラスのメソッドがリソースファイルを読み取り、結果を返すFixtureUtilsクラス。

import Java.nio.file.Files;
import Java.nio.file.Paths;

public class FixtureUtils
    {
        public static final AFixture fixtureFromName(final String fixtureName)
        {
            final String fixtureString = FixtureUtils.stringFromAsset(fixtureName);

            if (StringUtils.isEmpty(fixtureString))
            {
                return null;
            }

            final Gson gson = new Gson();
            final AFixture aFixture = gson.fromJson(fixtureString, AFixture.class);
            return aFixture;
        }

        private static final String stringFromAsset(final String filename)
        {
            try
            {
                final URL resourceURL = ClassLoader.getSystemResource(filename);
                if (resourceURL == null)
                {
                    return null;
                }

                final String result = new String(Files.readAllBytes(Paths.get(resourceURL.toURI())),
                                Charset.forName("UTF-8")); //$NON-NLS-1$
                return result;
            }
            catch (final Exception e)
            {
                e.printStackTrace();
            }

            return null;
        }

        private FixtureUtils()
        {
            // Ensure Singleton
        }
    }

そしてAFixtureクラスは次のようになります:

public class AFixture
{
    public List<JsonElement> validItems;
    public List<JsonElement> invalidItems;

    public AFixture()
    {
        super();
    }

    public List<JsonElement> getInvalidItems()
    {
        return this.invalidItems;
    }

    public List<JsonElement> getValidItems()
    {
        return this.validItems;
    }

    public void setInvalidItems(final List<JsonElement> invalidItems)
    {
        this.invalidItems = invalidItems;
    }

    public void setValidItems(final List<JsonElement> validItems)
    {
        this.validItems = validItems;
    }

}

:誤解しない限り、Java.nio.fileはJDK8から削除されていますが、JDK7を使用している場合は問題ありません。 JDK8を使用している場合は、stringFromAssetメソッドを FileInputStream (旧式のスタイル)または Scanner のように変更する必要があります。

1
Hesam