私の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
?
この質問が尋ねられたとき、これは単に機能していませんでした。幸いなことに、これは修正されています。
OPが実行しようとしたように、テキストファイルをapp/src/test/resources
フォルダーに配置する必要があります。さらに、テストクラスと同じパッケージにある必要があります。したがって、ReadFileTest.Java
フォルダーのパッケージcom.example.test
にapp/src/test/Java
がある場合、テストファイルはapp/src/test/resources/com/example/test
にあるはずです。
次に、次のようにテキストファイルにアクセスできます。
getClass().getResourceAsStream("testFile.txt")
これにより、テキストファイルのInputStream
が開きます。それが何をするのかわからない場合は、これを使用することができる多くの方法のいくつかを次に示します: InputStreamを文字列に読み取り/変換
これをbuild.gradleに追加します。
Android {
sourceSets {
test {
resources.srcDirs += ['src/test/resources']
}
androidTest {
resources.srcDirs += ['src/androidTest/resources']
}
}
}
ユニットテストでリソースにアクセスできるようにするには、src/test/resources
にファイルを追加します。インストルメンテーションテストの場合は、src/androidTest/resources
にファイルを追加します。
私はあなたが言ったのと同じような構造でプロジェクトを進めています。私はすべてのサーバー応答を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 のように変更する必要があります。