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.

  • Actualizar Robolectric 2.4: Obtener error de etiqueta de aplicación para proyectos de biblioteca en eclipse
  • Simulando un clic en un elemento de menú en Robolectric
  • Robolectric: Pruebas con ormlite
  • Osx maven running tests Excepción: java.lang.OutOfMemoryError lanzado desde el UncaughtExceptionHandler en el subproceso "main"
  • Parse + Robolectric causando java.lang.VerifyError: Tipo incorrecto en pila de operandos
  • Robolectric visible () "W / InputEventReceiver: Se ha intentado consumir eventos de entrada agrupados pero el receptor de eventos de entrada ya se ha eliminado."
  • Error: java.lang.UnsatisfiedLinkError con roboelectric y reino
  • Cambiar la conectividad de Android con Robolectric
  • Pruebas Robolectric que se ejecutan en Android Studio pero no en la línea de comandos
  • Recursos $ NotFoundException al ejecutar pruebas Roboeléctricas
  • ClassCastException: NoClassDefFoundError no se puede transmitir a RuntimeException
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.