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

Utilizo estos pasos en la consola.

  1. android create avd –force -n prueba -t "android-21"
  2. emulador -avd test -no-skin -no-audio -no-window &
  3. adb wait-for-device
  4. entrada del casquillo del ad keyevent 82 &
  5. gradle clean installDebug
  6. 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?

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 sustituir assemble por build (incluye lint ) y utilizar connectedCheck (incluye connectedAndroidTest ).
  • 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.
  • JUnit prueba para la aplicación de Android con fragmentos
  • UnsatisfiedLinkError cuando la unidad de prueba WritableNativeMap
  • Junit / Mockito - esperar la ejecución del método
  • Actividad de prueba onCreate Exception
  • NullPointerException validando el correo electrónico
  • Java.lang.IllegalAccessError: Clase ref en clase pre-verificada resuelto a la implementación inesperada obteniendo mientras ejecuta proyecto de prueba?
  • Cómo escribir una prueba de unidad para un controlador de excepción de subprocesos no detectados.
  • NullPointerException en la reflexión durante el arranque de Robolectric - cualquier sugerencias?
  • Espresso - compruebe si TextView existe en ListView
  • ¿Es posible ejecutar pruebas de unidad de Android Espresso en métodos anotados @BeforeClass?
  • ¿Puedo imprimir un mensaje de información en las pruebas JUnit?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.