2015-06-22 7 views
2

Я использую Robolectric 3, и я пытаюсь загрузить некоторые ресурсы, которые находятся в моей папке test/res/.Robolectric 3: Загрузка определенного ресурса теста

Вот моя иерархия файлов:

project/ 
|-src/ 
|--main/ 
|---AndroidManifest.xml 
|---res/ 
|----raw/ 
|-----prod.json 
|--test/ 
|---java/ 
|----com.app/ 
|-----CustomTestRunner.java 
|-----Mytest.java 
|---res/ 
|----raw/ 
|-----test.json 

Я хотел бы в MyTest.java сделать что-то вроде

RuntimeEnvironment.application.getResources().openRawResource(R.raw.test); 

, но я не хочу, чтобы переопределить все мои «стандартный» res/ папку, потому что я также нужен файл prod.json внутри моего теста.

Любая идея о том, как это сделать?

Спасибо

ответ

2

Вместо сдачи JSON в SRC/тест/RES/сырье вы можете поместить его в SRC/тест/ресурсы/

, а затем вы можете использовать его (с последней плагин сборки и последняя AS) с помощью getResource

Помните, что существует ошибка в более старых версиях - вам нужно использовать AS из канального канала: https://code.google.com/p/android/issues/detail?id=136013

+1

Я обнаружил, что мне нужно использовать ресурсы/папку, а не res/(или активы /), я скорректировал свой тест, чтобы загрузить файл из загрузчика классов, вместо того, чтобы использовать загрузку android raw. – pdegand59

0

В Gradle вы можете определить тестовый Рез, добавляя свой стандартный Рез.

Что-то вроде этого:

android{ 

sourceSets { 

    test { 
     res.srcDirs = ['src/test/res', 'src/main/res'] 

     } 
    } 
} 
+0

Это не работает. 'R.raw.test' не существует. – pdegand59

1

Это известная проблема, и отслеживается на https://code.google.com/p/android/issues/detail?id=136013

Некоторые сообщают, что это фиксируется Gradle андроид плагин версии 1.3, но не для андроид студии. Исправление планируется для Android Studio 1.3, но кто-то разместил обходной путь, который работает с обоими инструментами в версии 1.2

Вот код с небольшой модификацией, потому что я не мог найти использованную StringUtils класс:

gradle.projectsEvaluated { 
    def variants = android.applicationVariants.collect() 

    tasks.withType(Test) { task -> 
    try { 
     variants.each { variant -> 
      def buildTypeName = variant.buildType.name.capitalize() 

      def productFlavorNames = variant.productFlavors.collect { it.name.capitalize() } 
      if (productFlavorNames.isEmpty()) { 
       productFlavorNames = [""] 
      } 
      def productFlavorName = productFlavorNames.join('') 
      def flavor = uncapitalize(productFlavorName) 

      def variationName = "${productFlavorName}${buildTypeName}" 

      if (task.name.contains(variationName)) { 
       def variationPath = variant.buildType.name; 

       if (productFlavorName != null && !productFlavorName.isEmpty()) { 
        variationPath = uncapitalize(productFlavorName) + "/" + variationPath 
       } 

       def copyTestResourcesTask = project.tasks.create("copyTest${variationName}Resources", Copy) 
       copyTestResourcesTask.from("${projectDir}/src/test/resources") 
       copyTestResourcesTask.into("${buildDir}/intermediates/classes/test/${variationPath}") 

       // Makes the test task depend on the copy test resource variation task 
       task.dependsOn(copyTestResourcesTask) 

       variants.remove(variant) 

       throw new Exception("Break") // Breaking the loop 
      } 
     } 
    } catch (Exception e) {} // Just drop the exception 
    } 
} 
Смежные вопросы