Gradle JUnit Espresso en el emulador connectedAndroidTest java.lang.IncompatibleClassChangeError
Tengo una prueba de unidad simple para un método estático y ejecutarlos en Emulator. (El objetivo es correr en la nube de CI por lo que estoy probando en el emulador.)
Gradle 2.2.1 Emulador Android 5.0
- prueba si un botón inicia una nueva actividad en android junit (pref sin robotium)?
- Cómo burlar getApplicationContext
- Dependencia entre las pruebas de JUnit que funcionan simultáneamente en varios dispositivos
- Integración Roboeléctrica y Pepino
- ¿Cómo hacer simples pruebas junit de vainilla en android? Cómo obtener un error al hacer
Utilizo estos pasos en la consola.
- android create avd –force -n prueba -t "android-21"
- emulador -avd test -no-skin -no-audio -no-window &
- adb wait-for-device
- entrada del casquillo del ad keyevent 82 &
- gradle clean installDebug
- gradle connectedAndroidTest
construir un gradiente
dependencies { ... androidTestCompile('com.jakewharton.espresso:espresso:1.1-r3') { exclude group: 'com.squareup.dagger' exclude group: 'com.squareup.dagger:dagger:1.2.1' } } android { compileSdkVersion 21 buildToolsVersion "21.1" defaultConfig { minSdkVersion 16 targetSdkVersion 21 testInstrumentationRunner "com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner" } sourceSets { androidTest.setRoot('src/androidTest') } }
El registro de errores es
Tests on test(AVD) - 5.0 failed: Instrumentation run failed due to 'java.lang.IncompatibleClassChangeError' com.android.builder.testing.ConnectedDevice > hasTests[test(AVD) - 5.0] FAILED No tests found.
¿Qué podría producir este error?
- Prueba de unidad Actividad.startService () llamada?
- Android Studio 1.1, instalación de prueba junit simple
- Error: no se puede encontrar el símbolo en Android gradle library module unit test
- Pruebas automatizadas en el desarrollo de Android
- ¿Cómo ejecutar la prueba de unidad en un módulo de Android?
- Android TestRunner falla debido a la excepción de IllegalState
- AndroidManifest en el directorio androidTest que se ignora
- Cobertura de código Emma para la prueba de androide JUnit
Respuesta breve:
Esto parece un buen enlace sobre java.lang.IncompatibleClassChangeError
. Y si lo intentas en CI:
El emulador no se inicia completamente después de esperar por el dispositivo, no está preparado para las pruebas y la aplicación no está instalada debido a un tiempo de espera, por lo que no se realizan pruebas y la compilación falla a medida que se agrega un nuevo comportamiento para avisarle.
Puede reemplazar adb wait-for-device
por un bucle en espera de estado stopped
(totalmente arrancado) comprobando adb -e shell getprop init.svc.bootanim
como lo hace este script en dominio público. Más información aquí .
Posible problema de IC, Double Espresso fue obsoleta y Espresso 2.0 fue lanzado:
Acerca de CI y no se encontraron pruebas:
Respondí a otra pregunta, pero específica para Travis-ci . Error similar, pero debido a la secuencia de comandos utilizados se escuchó. Si ejecuta gradle installDebug --debug
sabrá más sobre el error (comparta el registro aquí).
Pero si ejecuto los mismos pasos en un servidor CI, si tengo razón, verá una InstallException causada por ShellCommandUnresponsiveException debido a dos minutos INSTALL_TIMEOUT
. Puede aumentar este valor utilizando una variable de entorno ADB_INSTALL_TIMEOUT=6
#minutes, pero ahora no es su problema.
Si lo está ejecutando localmente primero, pruebe sin -no-window
(para que lo vea) o agregue -no-boot-anim
(acelerarlo, pero es incompatible con el script wait-for-emulator) o use adb wait-for-device && sleep 300
(para asegurarse de que el emulador está completamente arrancado).
Acerca de Espresso:
Double Espresso está obsoleto porque Espresso 2.0 ya está disponible . Double Espresso es un puerto Gradle puro de Espresso 1.1 y Jake Wharton lo desaprobó cuando la versión 2.0 fue publicada hace dos semanas.
Actualizaron el wiki y JavaDoc (lo moverán a android.com) .
Ahora puede utilizar el repositorio de soporte de Android para descargar la versión más reciente.
Y Google publicó nuevas muestras:
Prerrequisitos de las muestras: Android SDK v21, Android Build Tools v21.1.2, Android Support Repository.
Estas muestras utilizan el sistema de compilación Gradle. Para crear un proyecto, ingrese el directorio del proyecto y utilice el comando ./gradlew assemble o use "Import Project" en Android Studio. Utilice ./gradlew connectedCheck para ejecutar las pruebas en un emulador o dispositivo conectado.
Acerca de las tareas de Gradle:
Desde las tareas de Android y las pruebas en ejecución (Guía del usuario del complemento Gradle):
-
assemble
La tarea de montar la (s) salida (s) del proyecto -
connectedCheck
Ejecuta comprobaciones que requieren un dispositivo o emulador conectado.
Las comprobaciones que requieren un dispositivo conectado se inician con la tarea de anclaje llamada connectedCheck
. Esto depende de la tarea androidTest y por lo tanto, se ejecutará. Esta tarea realiza lo siguiente:
- Asegúrese de que la aplicación y la aplicación de prueba se construyen (dependiendo de assembleDebug y assembleTest)
- Instalar ambas aplicaciones
- Ejecutar las pruebas
- Desinstale ambas aplicaciones.
Por eso pienso:
- Es un buen momento para migrar a Espresso 2.0 (y evitar el problema de las dependencias? ).
- Necesitas esperar a que el emulador se detenga y te recomiendo este enlace para entenderlo.
- No necesita tareas específicas de
install*
y puede sustituirassemble
porbuild
(incluyelint
) y utilizarconnectedCheck
(incluyeconnectedAndroidTest
). - Si hay más de un ABI instalado, necesitará elegir uno (y responder no):
- echo no | android create avd -f -n test -t $ANDROID_TARGET -b $ANDROID_ABI
- echo no | android create avd -f -n test -t $ANDROID_TARGET -b $ANDROID_ABI
- Intento sus muestras en el servidor del CI que usted elige como segundo paso que sigue su meta.
- org.json.JSONObject no se puede convertir en JSONArray
- java.lang.IllegalStateException: La actividad ha sido destruida