Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Recursos $ NotFoundException al usar Robolectric con Gradle

He estado siguiendo este tutorial sobre la configuración de Robolectric para probar mi proyecto Gradle de Android.

Sigo golpeando este error:

android.content.res.Resources$NotFoundException: no such label com.mypackage.dev:string/app_name 

Al descargar el proyecto de ejemplo del tutorial he establecido que el problema es mi productFlavors (dev, puesta en escena, producción). La adición de sabores al proyecto de ejemplo de trabajo causa el mismo problema. Puedes ver un esquema de mi build.gradle en esta respuesta .

He visto varias respuestas (por ejemplo, aquí ) que sugieren que tengo que especificar el sourceSets para cada sabor. He intentado muchas combinaciones, pero no puedo hacerlo bien. ¿Alguien puede ayudar?

La otra cosa que me confunde es que todas las muestras Robolectric que he visto parecen estar especificando el sourceSets y dependencias para "instrumentTest", a pesar de que las pruebas Robolectric son siempre sólo en la carpeta "prueba". En mi caso ya tengo pruebas Robotium en la carpeta instrumentTest, y no veo por qué necesitaría agregar dependencias Robolectric para el código Robotium.

  • Robolectric usando Fragments y ActionBarCompat NullPointerException
  • Robolectric dice "AndroidManifest.xml no encontrado"
  • Mock Retrofit Observable <T> respuesta en las pruebas de la unidad Android
  • ¿Cómo funcionan exactamente los objetos Shadow personalizados en Robolectric?
  • Archivo de clase para android.support.v4.widget.DrawerLayoutImpl no se encuentra en travis support-v4 21.0
  • Error al usar Robolectric para probar un ActionBarActivity
  • Pruebas con Robolectric y ANT
  • ¿Cómo puedo probar fragmentos con Robolectric?
  • 3 Solutions collect form web for “Recursos $ NotFoundException al usar Robolectric con Gradle”

    Me topé con el mismo problema (recursos no encontrados) y encontré una solución en la fuente robolectric. Hay un setter para PackageName, por lo que en mi corredor de prueba personalizado establezco el nombre del paquete antes de devolver el manifiesto. Algo como:

     @Override protected AndroidManifest getAppManifest(Config config) { String manifestProperty = System.getProperty("android.manifest"); if (config.manifest().equals(Config.DEFAULT) && manifestProperty != null) { String resProperty = System.getProperty("android.resources"); String assetsProperty = System.getProperty("android.assets"); AndroidManifest manifest = new AndroidManifest(Fs.fileFromPath(manifestProperty), Fs.fileFromPath(resProperty), Fs.fileFromPath(assetsProperty)); manifest.setPackageName("com.mypackagename"); return manifest; } return super.getAppManifest(config); } 

    Espero que esto ayude.

    Robolectric solucionó este problema en la versión 3.0. Por lo tanto, utilice la última versión de Robolectric con parámetros de constantes definidos en la anotación @Config .

     @Config( sdk = 21, manifest = "src/main/AndroidManifest.xml", constants = BuildConfig.class ) @RunWith(RobolectricTestRunner.class) 

    Además, un elemento importante – para el trabajo Robolectric correcto su applicationId en gradle.build debe ser igual al package en AndroidManifest . El uso de applicationIdSuffix no afecta a Robolectric.

    Puedes arreglar esto especificando 'packageName' en tu @Config para que se convierta en:

     @Config( sdk = 21, manifest="src/main/AndroidManifest.xml", constants = BuildConfig.class, packageName = "com.mypackage" //this is whatever value is your AndroidManifest.xml at <manifest ... package="com.mypackage".../> ) 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.