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.
- Prohibido degradar los dispositivos que utilizaban permisos M anteriormente
- Utilizando facebook sdk en android studio
- Cómo instalar el SDK de GMS de Google Play Services en CircleCI
- ¿Cómo subo una biblioteca aar a Nexus?
- Problema de migración de desarrollo nativo de Android Studio 2.2
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?
- Gradle no puede encontrar android_native_app_glue
- Android Studio: migrar complejo build.xml a build.gradle
- ¿Cómo eliminar mockable-android-23.jar automáticamente?
- Android Studio gradle - ### - bin.zip vs gradle - ### - todos.zip
- Android Wear Project Gradle Sync falla
- Error Gradle - No se puede llamar IncrementalTask.taskAction () en la tarea ': project: mergeDebugResources'
- Android Studio SOLO! DexException: No se puede combinar el nuevo índice 65536 en una instrucción no jumbo
- Uso del paquete com.bea.xml.stream en android
Referencia para otros que pueden venir a este puesto como yo venía, para que no pierdan el tiempo.
-
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.
-
Olvídate de eso ActivityInstrumentationTestCase2 para siempre!
-
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().getTargetContext()
para acceder al contexto de la aplicación en lugar de la instrumentación uno.
- YUV_420_888 interpretación en Samsung Galaxy S7 (Camera2)
- MediaPlayer en hilo separado vs ejecutándose en servicio a través de startForeground ()