Robolectric y Android Studio 1.1.0 y pruebas de biblioteca

Tengo problemas para obtener mis pruebas de unidad Robolectric para funcionar bajo la variante de prueba experimental AS 1.1. El error que estoy recibiendo se muestra a continuación;

java.lang.NoClassDefFoundError: com/my/app/R$string at com.my.app.MoneyFormatter.formatDealMessage(MoneyFormatter.java:63) ... Caused by: java.lang.ClassNotFoundException: com.my.app.R$string at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) at org.robolectric.bytecode.AsmInstrumentingClassLoader.loadClass(AsmInstrumentingClassLoader.java:100) ... 46 more 

Recupero este error ejecutando de la línea de comando en la raíz (app-name en Snippet1 ) el comando;

 ./gradlew core:library:test 

Este enfoque funciona en Android Studio 1.1 sin la prueba de unidad activada y utilizando el androide gradle herramientas en v1.0 (com.android.tools.build:gradle:1.0.0).

Configuración del proyecto

Mi proyecto tiene una estructura compleja como se prescribe a continuación;

 nombre de la aplicación
  |
  Aplicación
     | -> src
        | -> androidTest // Las clases de ayuda de Espresso residen aquí
        | -> androidTestFlavour1 // Espresso int pruebas relacionadas con 'sabor 1' 
        | -> androidTestFlavour2 // Espresso int tests relacionados con 'flavor 2'
        Flavour1
        | -> flavour2
        Principal
            + AndroidManifest.xml // Manifiesto para aplicaciones
        | -> testFlavour1 // Pruebas de unidad roboeléctrica para sabor 1
        | -> testFlavour2 // Pruebas de unidad roboeléctrica para sabor 2
  Núcleo
        Biblioteca
            | -> src
               | -> main // El código de la biblioteca reside aquí
                   + AndroidManifest.xml
               | -> test // Pruebas unitarias Robolectric para la biblioteca
  Gradle
  + Gradlew
  + Ajustes.grado
  + Locales.properties

Snippet 1 : Esquema del proyecto

He seguido varios consejos de Pivotal Labs ellos mismos y numerosas otras alternativas de elaboración casera sin éxito.

¿Qué es el error diciendo y qué debo cambiar para ponerlo bien?

Actualización: Así que después de haber inspeccionado el classpath que se utiliza para ejecutar las pruebas he observado las siguientes rutas de biblioteca;

  • /workspace/app/core/lib/build/intermediates/bundles/debug/classes.jar
  • / Workspace / app / core / lib / build / intermedios / clases / prueba / depuración
  • / Workspace / app / core / lib / build / intermedios / dependency-cache / test / debug

Ninguno de estos directorios contiene el archivo R$string.class generado por lo tanto la excepción. El directorio que contiene los archivos 'R' generados incluye los tipos de compilación de depuración y liberación de la aplicación. Asi que;

  • / Workspace / app / core / lib / build / intermedios / clases / depuración
  • / Workspace / app / core / lib / build / intermedios / clases / release

Esto indica que falta una parte del proceso de generación agregando los recursos de tipo de compilación "depurar" o "liberar". Esto también hace una copia de seguridad del comportamiento por el cual los casos de prueba de Java puro (que sólo dependen de las classes.jar) funcionan bien.

¡DE ACUERDO! Lo tengo trabajando. He agregado la línea siguiente al gradle de la construcción de la biblioteca para agregar por la fuerza los archivos "R" generados en el classpath de la prueba;

 sourceSets { test.java.srcDirs += "build/generated/source/r/debug" } 

Con esto he alcanzado el nirvana de pruebas Robolectric con;

 ./gradlew core:lib:test 

Y Espresso 2.0 con integración;

 ./gradlew connectedAndroidTest 

Detenga el reloj para la unidad y el soporte de prueba de integración en el IDE …. oh, ¿qué es eso? ¡¿7 AÑOS?! No hay amor perdido. Felicitaciones a esta respuesta que me mostró cómo agregar cosas a la prueba classpath.

  • Roboelectric 3.0 fragmentos de prueba
  • Robolectric usando Fragments y ActionBarCompat NullPointerException
  • Ejecutar RoboElectric varias veces con diferentes sdk versión
  • Agrupación de pruebas roboeléctricas utilizando junit Category en un proyecto gradle de Android
  • La base de datos Robolectric que accede arroja un error
  • Mock Android Application class para pruebas con Robolectric en App con Dagger 2
  • Error Robolectric y Google Analytics en las pruebas
  • Prueba de tareas asíncronas con robolectric
  • Prueba de Android con Robolectric
  • Robolectric Unit Test falla con las actualizaciones de Android Studio 2.3
  • Robolectric: Prueba de que una cancelación en el diálogo no inició nueva actividad
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.