У мене було багато проблем з тестовими ресурсами в 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