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;
- Pruebe la carpeta de recursos con Robolectric y Gradle
- Android Robolectric Gradle - java.lang.OutOfMemoryError: PermGen espacio
- Cómo utilizar gradle-android-test-plugin
- Prueba de solicitudes okHttp con Robolectric - callbacks
- Casos de prueba de unidad con JUnit + (Robolectric o Mockito o ambos en Android)
./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.
- Roboelectric RoboAttributeSet - Cómo usar esto
- Soporte de la clase Robolectric de Android. Cómo tener las referencias de la clase de biblioteca R desde el proyecto de aplicación
- Volver a cargar variables estáticas al inicio de cada prueba de unidad
- Cómo calcular la cobertura de la prueba con Robolectric
- Robolectric 2.x + Maven en Jenkins falló con las dependencias APKLIB
- ¿Cómo probar la clase de aplicación con Robolectric?
- Robolectric no inicia actividad en la orientación correcta
- Robolectric: probar un ListView con el patrón ViewHolder causa NullPointerException
¡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