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;
- Los depósitos Robolectric en objetos de aplicación que cargan bibliotecas JNI. ¿Puedo obtener una solución?
- Prueba de la unidad Android con Robolectric lanza error AndroidManifest.xml no se encuentra o no es un archivo
- Android instrumentación prueba java.lang.UnsatisfiedLinkError en el uso de AndroidJunitRunner y AndroidJUnit4
- Estoy estudiando Robolectric pero se ha producido un error
- Soporte de la clase Robolectric de Android. Cómo tener las referencias de la clase de biblioteca R desde el proyecto de aplicación
./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.
- Robolectric With Gradle:. \ Res \ values no es un directorio
- ¿Cómo puedo sombrear el PackageManager con Robolectric
- Google Analytics - NullPointerException en la prueba
- Obtención de ClassNotFoundException al ejecutar pruebas Robolectric con el complemento Maven surefire
- Error de instrumentación con pruebas RoboElectric 2 en IntelliJ
- Robolectric 2.4 NoSuchMethodError no se puede transmitir a RuntimeException al crear actividad
- NPE al obtener Robolectric ShadowApplication con Volley y Dagger
- Robolectric 3.0 - Recurso no resuelto cuando se utiliza applicationIdSuffix
¡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.
- El sonido de notificación no funciona para api 10 android
- Compartir fotos con Android con FileProvider