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:
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éussissent):
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 (pas 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 depuis Android Studio, mais ils passent sur la ligne de commande avec ./gradlew data:test
. Pour contourner cela, 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"))
}
Usage: resource('/test.txt')
Android Studio 2.3, Gradle 3.3