単体テストで、パスをハードコーディングせずに、(デスクトップ)ファイルシステムのjsonファイルからデータを読み取るにはどうすればよいですか?
静的文字列を作成するのではなく、ファイルからテスト入力(解析メソッド用)を読み取りたいのですが。
ファイルはユニットテストコードと同じ場所にありますが、必要に応じてプロジェクト内の別の場所に配置することもできます。Android Studioを使用しています。
test_documents.json
ますか?アセットディレクトリ?
単体テストで、パスをハードコーディングせずに、(デスクトップ)ファイルシステムのjsonファイルからデータを読み取るにはどうすればよいですか?
静的文字列を作成するのではなく、ファイルからテスト入力(解析メソッド用)を読み取りたいのですが。
ファイルはユニットテストコードと同じ場所にありますが、必要に応じてプロジェクト内の別の場所に配置することもできます。Android Studioを使用しています。
test_documents.json
ますか?アセットディレクトリ?
回答:
android-gradle-plugin
バージョンによって:
1.バージョン1.5以降:
jsonファイルを入れてsrc/test/resources/test.json
、それを次のように参照するだけです
classLoader.getResource("test.json").
Gradleの変更は必要ありません。
2. 1.5未満のバージョン:(または何らかの理由で上記の解決策が機能しない場合)
少なくともAndroid Gradle Pluginバージョン1.1を使用していることを確認してください。リンクに従って、Android Studioを正しくセットアップします。
test
ディレクトリを作成します。単体テストクラスをjava
ディレクトリに配置し、リソースファイルをres
ディレクトリに配置します。Android Studioは次のようにマークする必要があります。
gradle
リソースをクラスディレクトリにコピーして、それらを次の場所から見えるようにするタスクを作成しますclassloader
。
android{
...
}
task copyResDirectoryToClasses(type: Copy){
from "${projectDir}/src/test/res"
into "${buildDir}/intermediates/classes/test/debug/res"
}
assembleDebug.dependsOn(copyResDirectoryToClasses)
これで、このメソッドを使用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());
}
src/test/resources/test.json
、として参照しますclassLoader.getResource("test.json")
。Gradleの変更は必要ありません。内部のネストされたフォルダresources
も機能しています。
classLoader
?このコード行をどこに配置しますか?返された結果を使って何ができますか?より完全なコードを入力してください。-1
./src/test/resources/file.txt
Kotlinで読むには:TestClassName::class.java.getResource("/file.txt")!!.readText()
ローカルユニットテスト(インストゥルメンテーションテストに対して)の場合、src/test/resources
classLoaderを使用してファイルを配置し、読み取ることができます。たとえば、次のコードmyFile.txt
はリソースディレクトリのファイルを開きます。
InputStream in = this.getClass().getClassLoader().getResourceAsStream("myFile.txt");
それはで働いた
val myFile = ClassLoader.getSystemResource("myFile.txt").readText()
私の場合、解決策はgradleファイルに追加することでした
sourceSets {
test.resources.srcDirs += 'src/unitTests/resources'
}
その後、すべてがAS 2.3.1によって検出されました
javaClass.classLoader.getResourceAsStream("countries.txt")
root/app/src/test/resources/test.json
2.次のようにデータを読み取ります:val jsonFile = ClassLoader.getSystemResource("test.json").readText()
Android Studioのテストリソースに多くの問題があったため、わかりやすくするためにいくつかのテストを設定しました。私の
mobile
(Androidアプリケーション)プロジェクトに次のファイルを追加しました。
mobile/src/test/java/test/ResourceTest.java
mobile/src/test/resources/test.txt
mobile/src/test/resources/test/samePackage.txt
テストクラス(すべてのテストに合格):
assertTrue(getClass().getResource("test.txt") == null);
assertTrue(getClass().getResource("/test.txt").getPath().endsWith("test.txt"));
assertTrue(getClass().getResource("samePackage.txt").getPath().endsWith("test/samePackage.txt"));
assertTrue(getClass().getResource("/test/samePackage.txt").getPath().endsWith("test/samePackage.txt"));
assertTrue(getClass().getClassLoader().getResource("test.txt").getPath().endsWith("test.txt"));
assertTrue(getClass().getClassLoader().getResource("test/samePackage.txt").getPath().endsWith("test/samePackage.txt"));
同じルートプロジェクトにと呼ばれるJava(Androidではない)プロジェクトがありdata
ます。同じプロジェクトをデータプロジェクトに追加した場合:
data/src/test/java/test/ResourceTest.java
data/src/test/resources/test.txt
data/src/test/resources/test/samePackage.txt
その後、Android Studioから実行すると、上記のすべてのテストが失敗し./gradlew data:test
ますが、コマンドラインでを渡します。それを回避するには、このハックを使用します(Groovy内)
def resource(String path) {
getClass().getResource(path) ?:
// Hack to load test resources when executing tests from Android Studio
new File(getClass().getClassLoader().getResource('.').path
.replace('/build/classes/test/', "/build/resources/test$path"))
}
使用法: resource('/test.txt')
Android Studio 2.3、Gradle 3.3
getClassLoader()
バージョンは期待どおりに機能します。つまり、Android Studioから、および私のmacOSマシンのコマンドラインから、そしてLinux CIサーバー(CircleCI)から実行されるファイルを見つけます。だから私はそれを使って、Gradle 3.3が後でそれを壊さないことを願っています...
build/resources/test
はインタラクティブなクラスパスに含まれていないため、コマンドラインからは機能しますが、ASからは機能しません。
「実行」->「構成の編集」->「JUnit」に移動し、ユニットテストの実行構成を選択すると、「作業ディレクトリ」設定があります。それはあなたのjsonファイルがどこにあっても指す必要があります。これは他のテストを壊す可能性があることに注意してください。
new File()
またはを使用してファイルをロードするために使用できますが、上記のクラスパスのロード方法では直接動作しません。別の作業dirsにを使用するようにそれはそれぞれの新しい実行構成は、作業ディレクトリを設定する必要があるため、ビットトリッキーだし、デフォルトでASとGradleのコマンドライン...などの痛み
ここに私の調査結果を追加する必要がありますが。私はこれが少し古いことを知っていますが、src / test / resourcesディレクトリがなく、プロジェクト全体に対して1つの単一のリソースディレクトリしかない新しいバージョンのGradleの場合、この行をGradleファイルに追加する必要があります。
android {
testOptions {
unitTests {
includeAndroidResources = true
}
}
}
これにより、次の方法でリソースにアクセスできます。
this.getClass().getClassLoader().getResourceAsStream(fileName);
私はこれを探していて、答えを見つけることができなかったので、ここで他の人を助けることにしました。