Dans un test unitaire, comment puis-je lire des données à partir d'un fichier json sur mon système de fichiers (de bureau), sans coder en dur le chemin?
Je voudrais lire l'entrée de test (pour mes méthodes d'analyse) à partir d'un fichier au lieu de créer des chaînes statiques.
Le fichier se trouve au même emplacement que mon code de test unitaire, mais je peux également le placer ailleurs dans le projet si nécessaire. J'utilise Android Studio.
test_documents.json
? répertoire des actifs?Réponses:
Selon la
android-gradle-plugin
version:1. version 1.5 et supérieure:
Mettez simplement le fichier json
src/test/resources/test.json
et référencez-le commeAucune modification de gradle n'est nécessaire.
2. version inférieure à 1.5 : (ou si pour une raison quelconque la solution ci-dessus ne fonctionne pas)
Assurez-vous que vous utilisez au moins Android Gradle Plugin version 1.1 . Suivez le lien pour configurer correctement Android Studio.
Créer un
test
répertoire. Placez les classes de test unitaire dans lejava
répertoire et placez votre fichier de ressources dans leres
répertoire. Android Studio doit les marquer comme suit:Créez une
gradle
tâche pour copier les ressources dans le répertoire des classes pour les rendre visibles pourclassloader
:Vous pouvez maintenant utiliser cette méthode pour obtenir une
File
référence pour la ressource de fichier:la source
src/test/resources/test.json
et référencez-le commeclassLoader.getResource("test.json")
. Aucune modification de gradle n'est nécessaire. Les dossiers imbriqués à l'intérieurresources
fonctionnent également.classLoader
? où placer cette ligne de code? que pouvez-vous faire avec le résultat de retour ?. Veuillez fournir un code plus complet. -1./src/test/resources/file.txt
à Kotlin:TestClassName::class.java.getResource("/file.txt")!!.readText()
Pour les tests unitaires locaux (par rapport aux tests d'instrumentation), vous pouvez placer des fichiers sous
src/test/resources
et les lire à l'aide de classLoader. Par exemple, le code suivant ouvre lemyFile.txt
fichier dans le répertoire des ressources.Cela a fonctionné avec
la source
val myFile = ClassLoader.getSystemResource("myFile.txt").readText()
Dans mon cas, la solution était d'ajouter au fichier gradle
Après cela, tout a été trouvé par AS 2.3.1
la source
root/app/src/test/resources/test.json
2. lire des données comme ceci:val jsonFile = ClassLoader.getSystemResource("test.json").readText()
J'ai eu beaucoup de problèmes avec les ressources de test dans Android Studio, j'ai donc mis en place quelques tests pour plus de clarté. Dans mon projet
mobile
(Application Android), j'ai ajouté les fichiers suivants:La classe de test (tous les tests réussissent):
Dans le même projet racine, j'ai un projet Java (pas Android) appelé
data
. Si j'ajoute les mêmes fichiers au projet de données:Ensuite, tous les tests ci-dessus échoueront si je les exécute depuis Android Studio, mais ils passent sur la ligne de commande avec
./gradlew data:test
. Pour contourner cela, j'utilise ce hack (dans Groovy)Usage:
resource('/test.txt')
Android Studio 2.3, Gradle 3.3
la source
getClassLoader()
versions fonctionnent comme prévu. C'est-à-dire qu'ils trouvent les fichiers, tous deux exécutés à partir d'Android Studio ET de la ligne de commande sur ma machine macOS et sur le serveur Linux CI (CircleCI). Donc je vais avec ça et j'espère que Gradle 3.3 ne le cassera pas plus tard ...build/resources/test
ne sont pas inclus dans le chemin de classe interactif.Si vous allez dans Exécuter -> Modifier les configurations -> JUnit puis sélectionnez la configuration d'exécution pour vos tests unitaires, il existe un paramètre «Répertoire de travail». Cela devrait indiquer où se trouve votre fichier json. Gardez à l'esprit que cela pourrait casser d'autres tests.
la source
new File()
ou similaire, mais cela ne fonctionne pas directement avec la méthode de chargement de chemin de classe décrite ci-dessus. C'est aussi un peu délicat car chaque nouvelle configuration d'exécution doit définir le répertoire de travail, et par défaut la ligne de commande AS et Gradle aiment utiliser différents répertoires de travail ... une telle douleurJe pensais que je devrais ajouter mes conclusions ici. Je sais que c'est un peu vieux mais pour les nouvelles versions de Gradle, où il n'y a PAS de répertoire src / test / resources, mais un seul répertoire de ressources pour l'ensemble du projet, vous devez ajouter cette ligne à votre fichier Gradle.
En faisant cela, vous pouvez accéder à votre ressource avec:
J'ai cherché ceci et je n'ai pas trouvé de réponse, alors j'ai décidé d'aider les autres ici.
la source
En fait, c'est ce qui a fonctionné pour moi avec les tests d'instrumentation (exécutant Android Studio version 3.5.3 , Android Gradle Plugin version 3.5.3 , Gradle version 6.0.1 ):
src/androidTest/assets
dossierInputStream is = InstrumentationRegistry.getInstrumentation().getContext().getAssets().open("filename.txt");
la source