Dans un test unitaire, comment puis-je lire les données d'un fichier json sur mon système de fichiers (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 d'unité, mais je peux également le placer ailleurs dans le projet si nécessaire. J'utilise Android Studio.
Cela dépend de Android-gradle-plugin
version:
1. version 1.5 et supérieure:
Il suffit de mettre le fichier json dans src/test/resources/test.json
et le référence comme
classLoader.getResource("test.json").
Aucune modification de grade 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éez le répertoire test
. Placez les classes de test unitaire dans le répertoire Java
et votre fichier de ressources dans le répertoire res
. Android Studio devrait les marquer comme suit:
Créez la tâche gradle
pour copier les ressources dans le répertoire classes afin de les rendre visibles pour classloader
:
Android{
...
}
task copyResDirectoryToClasses(type: Copy){
from "${projectDir}/src/test/res"
into "${buildDir}/intermediates/classes/test/debug/res"
}
assembleDebug.dependsOn(copyResDirectoryToClasses)
Vous pouvez maintenant utiliser cette méthode pour obtenir la référence File
de la ressource fichier:
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());
}
Pour les tests unitaires locaux (par rapport aux tests d’instrumentation), vous pouvez placer les fichiers sous src/test/resources
et lisez-les à l'aide de classLoader. Par exemple, le code suivant ouvre myFile.txt
fichier dans le répertoire des ressources.
InputStream in = this.getClass().getClassLoader().getResourceAsStream("myFile.txt");
Cela a fonctionné avec
Dans mon cas, la solution consistait à ajouter au fichier gradle
sourceSets {
test.resources.srcDirs += 'src/unitTests/resources'
}
Après, tout a été trouvé par AS 2.3.1
javaClass.classLoader.getResourceAsStream("countries.txt")
J'ai eu beaucoup de problèmes avec les ressources de test dans Android Studio, alors j'ai configuré quelques tests pour plus de clarté. Dans mon projet mobile
(application Android), j'ai ajouté les fichiers suivants. :
mobile/src/test/Java/test/ResourceTest.Java
mobile/src/test/resources/test.txt
mobile/src/test/resources/test/samePackage.txt
La classe de test (tous les tests réussis):
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"));
Dans le même projet racine, j'ai un projet Java (non Android) appelé data
. Si j'ajoute les mêmes fichiers au projet de données:
data/src/test/Java/test/ResourceTest.Java
data/src/test/resources/test.txt
data/src/test/resources/test/samePackage.txt
Ensuite, tous les tests ci-dessus échoueront si je les exécute à partir de Android Studio, mais ils passent sur la ligne de commande avec ./gradlew data:test
. Pour contourner ce problème, j’utilise ce hack (dans 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"))
}
Utilisation: resource('/test.txt')
Android Studio 2.3, Gradle 3.3
Si vous sélectionnez 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 pointer où que se trouve votre fichier JSON. Gardez à l'esprit que cela pourrait casser d'autres tests.
Je pensais que je devrais ajouter mes résultats ici. Je sais que c'est un peu vieux, mais pour les versions plus récentes 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.
Android {
testOptions {
unitTests {
includeAndroidResources = true
}
}
}
En faisant cela, vous pouvez accéder à votre ressource avec:
this.getClass().getClassLoader().getResourceAsStream(fileName);
Je cherchais ça et je ne trouvais pas de réponse. J'ai donc décidé d'aider les autres ici.