Android / Gradle prueba de espresso no iniciar actividad

Tengo dificultades para convencer al nuevo sistema de compilación de Android de que ejecute pruebas. Cuando se ejecuta la prueba que da la Unable to resolve activity for: Intent Error de Unable to resolve activity for: Intent que se ha discutido en otras preguntas, pero no hay nada en que haya arreglado mi problema.

Lo he desnudado para que mi paquete de prueba no se basa en mi paquete principal ( com.wealdtech.app ) en absoluto, pero todavía tiene el problema de iniciar la actividad.

Mi actividad de prueba:

 package com.wealdtech.test; import android.app.Activity; import android.os.Bundle; public class TileLayoutTestActivity extends Activity { @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); } } 

Y mi clase de prueba:

 package com.wealdtech.test; import android.test.ActivityInstrumentationTestCase2; public class TileLayoutTest extends ActivityInstrumentationTestCase2<TileLayoutTestActivity> { public TileLayoutTest() { super(TileLayoutTestActivity.class); } @Override protected void setUp() throws Exception { super.setUp(); setActivityInitialTouchMode(false); } public void testNull() { final TileLayoutTestActivity activity = getActivity(); activity.finish(); } 

Partes relevantes de build.gradle:

 apply plugin: 'android-library' android { compileSdkVersion 19 buildToolsVersion "19.0.3" compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } defaultConfig { minSdkVersion 11 targetSdkVersion 19 testPackageName "com.wealdtech.test" testInstrumentationRunner "com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner" } } 

El rastro de pila completo que obtengo es:

 java.lang.RuntimeException: Could not launch activity at com.google.android.apps.common.testing.testrunner.GoogleInstrumentation.startActivitySync(GoogleInstrumentation.java:286) at android.test.InstrumentationTestCase.launchActivityWithIntent(InstrumentationTestCase.java:119) at android.test.InstrumentationTestCase.launchActivity(InstrumentationTestCase.java:97) at android.test.ActivityInstrumentationTestCase2.getActivity(ActivityInstrumentationTestCase2.java:104) at com.wealdtech.test.TileLayoutTest.testNull(TileLayoutTest.java:21) at java.lang.reflect.Method.invokeNative(Native Method) at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214) at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:199) at android.test.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentationTestCase2.java:192) at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191) at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176) at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:554) at com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner.onStart(GoogleInstrumentationTestRunner.java:167) at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1701) Caused by: java.lang.RuntimeException: Unable to resolve activity for: Intent { act=android.intent.action.MAIN flg=0x14000000 cmp=com.wealdtech.test/.TileLayoutTestActivity } at android.app.Instrumentation.startActivitySync(Instrumentation.java:379) at com.google.android.apps.common.testing.testrunner.GoogleInstrumentation.access$101(GoogleInstrumentation.java:52) at com.google.android.apps.common.testing.testrunner.GoogleInstrumentation$2.call(GoogleInstrumentation.java:268) at com.google.android.apps.common.testing.testrunner.GoogleInstrumentation$2.call(GoogleInstrumentation.java:266) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:841) 

No he incluido mi AndroidManifest.xml porque todo lo que leo sugiere que no necesito agregar una intención para TileLayoutTestActivity , sin embargo he intentado hacer esto de todos modos y terminé con el mismo resultado.

También he intentado cambiar el plugin Gradle de android-library a android en caso de que estaba causando el problema, pero de nuevo el mismo resultado.

No puedo ver ninguna documentación relativa a los requisitos previos para las pruebas de Espresso o las pruebas con el sistema de compilación de Gradle, que todavía no he cubierto. ¿Alguna idea sobre cuál no puedo iniciar la actividad como parte de la prueba?

Referencia para otros que pueden venir a este puesto como yo venía, para que no pierdan el tiempo.

  1. Cambiar de legado, abandonado, feo ActivityInstrumentationTestCase2 a las anotaciones que es compatible con AndroidStudio, Gradle y Espresso 2. Esto será desarrollado por Google más.

  2. Olvídate de eso ActivityInstrumentationTestCase2 para siempre!

  3. Comience a usar @RunWith , @LargeTest , @Test , @Rule

Para un proyecto que utiliza el complemento de la android-library , es semi-exacto decir que el AndroidManifest.xml no se utiliza realmente. De hecho todo el manifiesto de un proyecto de la biblioteca necesita compilar es esto:

 <manifest package="com.package.yours"/> 

Cualquier permiso o intento que intente poner en él se ignorará cuando se cree el archivo AAR. Al ser una biblioteca, y tan cerca como puedo decir, nada en el manifiesto del proyecto de la biblioteca lo hace en el AAR (o JAR si usted está haciendo uno de ellos también).

¡Pero! Ese es el manifiesto que se va a utilizar cuando se crea un proyecto de prueba que se empuja a un dispositivo. Usted puede literalmente descargar src/androidTest/AndroidManifest.xml en src/androidTest/AndroidManifest.xml y gradle no le importará, pero tiene que agregar su actividad de prueba a src/main/AndroidManifest.xml o bien ./gradlew connectedCheck va a lanzar excepciones de tiempo de ejecución.

Mi proyecto se parece a esto (realmente lo hace, sólo cambié los nombres):

 src/ androidTest/ java/ com.package.mine/ TestActivity.java VariousTests.java main/ java/ com.package.mine/ FancyLibrary.java AndroidManifest.xml 

Y aquí está mi AndroidManifest.xml :

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.uie.uieanalytics"> <uses-permission android:name="android.permission.PERM_I_NEED"/> <application> <activity android:name=".TestActivity" /> </application> </manifest> 

De lo contrario, estoy usando el mismo test runner que tú, y mi build.gradle es lo suficientemente similar.

Para las pruebas de instrumentación, Android crea dos APK, uno con la aplicación y otro con las pruebas. Si pones actividad en androidTest sabor, entonces pertenece a la prueba APK. Si inicia una actividad utilizando la instrumentación (ya sea directamente o mediante ActivityTestRule ) más tarde, Android la buscará en el APK de la aplicación y no funcionará, ya que no hay tal actividad en el APK de la aplicación.

Para resolver el problema, puede definir una actividad de prueba (clase y manifiesto) en el estilo de debug de su aplicación. A continuación, se empaquetará con su aplicación APK y las pruebas funcionarán bien.

Actualización: o – como Austyn Mahoney sugirió – debe usar InstrumentationRegistry.getInstrumentation().getTargetContex‌​t() para acceder al contexto de la aplicación en lugar de la instrumentación uno.

  • Uso de las divisiones de APK para el tipo de generación Release pero no Debug
  • Utilice un campo local.properties al declarar un archivo buildConfigField
  • AppCompatActivity no se puede asignar a Actividad
  • Mi R en la biblioteca es rojo, pero puedo crear y ejecutar la aplicación normalmente
  • Generación dinámica de productFlavors y sourceSets usando una lista de nombres (con propiedades) en un archivo CSV / TXT
  • Los símbolos se quitan cuando se construye código nativo usando Gradle
  • Android Studio: No se puede eliminar el archivo original
  • Android Studio falla - unsupport no soportado versión secundaria mayor 51.0
  • Gradle build installRelease tarea falta en el proyecto de Android
  • Publicación de la Biblioteca de Android (aar) a Bintray con sabores elegidos
  • Comandos de Gradle fallan en API 23 Imagen del emulador de la API de Google (armeabi-v7a)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.