Wie kann ich in einem Komponententest Daten aus einer JSON-Datei auf meinem (Desktop-) Dateisystem lesen, ohne den Pfad fest zu codieren?
Ich möchte Testeingaben (für meine Parsing-Methoden) aus einer Datei lesen, anstatt statische Strings zu erstellen.
Die Datei befindet sich am selben Speicherort wie mein Unit-Test-Code, kann aber bei Bedarf auch an einer anderen Stelle im Projekt abgelegt werden. Ich benutze Android Studio.
test_documents.json
? Vermögensverzeichnis?Antworten:
Je nach
android-gradle-plugin
Version:1. Version 1.5 und höher:
Legen Sie einfach die json-Datei auf
src/test/resources/test.json
und verweisen Sie darauf alsEs ist keine Gradle-Modifikation erforderlich.
2. Version unter 1.5 : (oder wenn aus irgendeinem Grund die oben genannte Lösung nicht funktioniert)
Stellen Sie sicher, dass Sie mindestens Android Gradle Plugin Version 1.1 verwenden . Folgen Sie dem Link, um Android Studio korrekt einzurichten.
test
Verzeichnis erstellen . Legen Sie Unit-Test-Klassen imjava
Verzeichnis ab und legen Sie Ihre Ressourcendatei imres
Verzeichnis ab. Android Studio sollte sie wie folgt markieren:Erstellen Sie eine
gradle
Aufgabe, um Ressourcen in das Klassenverzeichnis zu kopieren und sie sichtbar zu machen fürclassloader
:Jetzt können Sie diese Methode verwenden, um eine
File
Referenz für die Dateiressource abzurufen:quelle
src/test/resources/test.json
und verweisen Sie darauf alsclassLoader.getResource("test.json")
. Es ist keine Gradle-Modifikation erforderlich. Verschachtelte Ordner im Innerenresources
funktionieren ebenfalls.classLoader
? Wo soll diese Codezeile platziert werden? Was können Sie mit dem Rückgabeergebnis tun? Bitte geben Sie einen vollständigeren Code an. -1./src/test/resources/file.txt
Kotlin zu lesen :TestClassName::class.java.getResource("/file.txt")!!.readText()
Bei lokalen
src/test/resources
Komponententests (im Vergleich zu Instrumentierungstests) können Sie Dateien ablegen und mit classLoader lesen. Der folgende Code öffnet beispielsweise diemyFile.txt
Datei im Ressourcenverzeichnis.Es hat funktioniert mit
quelle
val myFile = ClassLoader.getSystemResource("myFile.txt").readText()
In meinem Fall bestand die Lösung darin, der Gradle-Datei etwas hinzuzufügen
Danach wurde alles von AS 2.3.1 gefunden
quelle
root/app/src/test/resources/test.json
2. Daten wieval jsonFile = ClassLoader.getSystemResource("test.json").readText()
Ich hatte viele Probleme mit Testressourcen in Android Studio, daher habe ich aus Gründen der Übersichtlichkeit einige Tests eingerichtet. In meinem
mobile
Projekt (Android-Anwendung) habe ich folgende Dateien hinzugefügt:Die Testklasse (alle Tests bestehen):
Im selben Root-Projekt habe ich ein Java-Projekt (nicht Android) namens
data
. Wenn ich dem Datenprojekt dieselben Dateien hinzufüge:Dann schlagen alle oben genannten Tests fehl, wenn ich sie von Android Studio aus ausführe, aber sie übergeben die Befehlszeile mit
./gradlew data:test
. Um das zu umgehen, benutze ich diesen Hack (in Groovy)Verwendung:
resource('/test.txt')
Android Studio 2.3, Gradle 3.3
quelle
getClassLoader()
funktionieren die Versionen wie erwartet. Das heißt, sie finden die Dateien, die beide von Android Studio UND über die Befehlszeile auf meinem MacOS-Computer und auf dem Linux CI-Server (CircleCI) ausgeführt werden. Also mache ich damit weiter und hoffe, dass Gradle 3.3 es später nicht kaputt macht ...build/resources/test
nicht im interaktiven Klassenpfad enthalten sind.Wenn Sie zu Ausführen -> Konfigurationen bearbeiten -> JUnit gehen und dann die Ausführungskonfiguration für Ihre Komponententests auswählen, gibt es die Einstellung "Arbeitsverzeichnis". Das sollte zeigen, wo sich Ihre JSON-Datei befindet. Beachten Sie, dass dies andere Tests beschädigen kann.
quelle
new File()
oder ähnlich verwendet werden, funktioniert jedoch nicht direkt mit der oben beschriebenen Methode zum Laden von Klassenpfaden. Es ist auch ein bisschen knifflig, weil jede neue Laufkonfiguration das Arbeitsverzeichnis festlegen muss und standardmäßig AS- und Gradle-Befehlszeilen unterschiedliche Arbeitsverzeichnisse verwenden ... so ein SchmerzIch denke, ich sollte meine Erkenntnisse hier hinzufügen. Ich weiß, dass dies etwas alt ist, aber für die neueren Versionen von Gradle, in denen es KEIN Verzeichnis src / test / resources gibt, sondern nur ein einziges Ressourcenverzeichnis für das gesamte Projekt, müssen Sie diese Zeile zu Ihrer Gradle-Datei hinzufügen.
Auf diese Weise können Sie auf Ihre Ressource zugreifen mit:
Ich habe danach gesucht und konnte keine Antwort finden, deshalb habe ich beschlossen, anderen hier zu helfen.
quelle
Das hat bei Instrumentationstests (Ausführen von Android Studio Version 3.5.3 , Android Gradle Plugin Version 3.5.3 , Gradle Version 6.0.1 ) für mich funktioniert :
src/androidTest/assets
OrdnerInputStream is = InstrumentationRegistry.getInstrumentation().getContext().getAssets().open("filename.txt");
quelle