2012-03-01 7 views
18

Estoy escribiendo pruebas para un componente en mi aplicación Android. Este componente usa actividades para hacer algunos informes. Entonces necesito una actividad para probar el componente (fea arquitectura) y pensé que sería fácil crear una actividad ficticia dentro del proyecto de prueba y crear pruebas heredadas de ActivityInstrumentationTestCase2<TestActivity>, pero por alguna razón siempre recibo la excepción java.lang.RuntimeException: Unable to resolve activity for: Intent { act=android.intent.action.MAIN flg=0x10000000 cmp=com.xxx/.Testctivity }.¿Es posible definir Actividad dentro del proyecto de prueba de Android y ejecutar una prueba en su contra?

La actividad de prueba se agrega al archivo de manifiesto y parece que el paquete está configurado correctamente.

He tratado de ponerlo en los paquetes com.xxx (paquete de la aplicación) y com.xxx.test, sin suerte. Pero cuando muevo TestActivity a la aplicación de destino todo funciona bien. Así que comencé a preguntarme cuál es la diferencia entre el proyecto de prueba y mi aplicación y es incluso posible tener actividades dentro de los proyectos de prueba.

Respuesta

9

Sí, es posible, pero no es recomendable, ya que afirma en el official dev guide:

Una vez que haya creado un proyecto de prueba, lo rellena con un paquete de prueba. Este paquete no requiere una Actividad, aunque puede definir uno si lo desea. Aunque su paquete de prueba puede combinar clases de actividad, clases de casos de prueba o clases ordinarias, su caso de prueba principal debería extender una de las clases de caso de prueba de Android o clases JUnit, ya que proporcionan las mejores características de prueba.

Con el fin de hacer esto, es necesario:

  1. definir su actividad maniquí en AndroidManifest.xml del proyecto de la prueba.
  2. Cambie el punto del paquete de destino de la instrumentación a sí mismo en Test AndroidManifest.xml del proyecto. (la clase de actividad bajo prueba debe bajo el paquete de destino de instrumentación).

Supongamos que tengo un proyecto de prueba com.example.test contiene dos DummyActivity clase y DummyActivityTest, luego si quieres DummyActivity prueba usando DummyActivityTest, es necesario definir AndroidManifest.xml de su proyecto de prueba como esta:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.test" 
    android:versionCode="1" 
    android:versionName="1.0" > 

<uses-sdk android:minSdkVersion="10" /> 

<!-- targetPackage point to test project itself --> 
<instrumentation 
    android:name="android.test.InstrumentationTestRunner" 
    android:targetPackage="com.example.test" /> 

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <uses-library android:name="android.test.runner" /> 
    <activity 
     android:name=".DummyActivity" 
     android:label="@string/app_name" > 
    </activity> 
</application> 

+0

Cuando cambio a la libre targetPackage , comienza a fallar con NoSuchMethodException en InstrumentationTestRunner.onCreate – basin

+0

Tuve problemas con este enfoque; Creo que si el paquete/manifest/@ es el mismo que/manifest/instrumentation/@ android: targetPackage, las pruebas reemplazarán efectivamente la aplicación bajo prueba, lo que imposibilitará hacer referencia a sus clases. Obtenía ClassNotFoundExceptions. –

+1

Lo hice funcionar con este enfoque agregando un AndroidManifest.xml adicional en el directorio androidTest. Pero con la versión más reciente de Android Studio, a partir del 2.3.1 estoy usando en este momento, el elemento '' no es necesario. –

0

El proyecto y la actividad de prueba pueden coexistir juntos, poner el nombre del paquete de destino como el nombre del paquete del proyecto de prueba

+0

Gracias por su respuesta. He tratado como usted propuso, pero ahora consigo java.lang.RuntimeException: Excepción durante la construcción de baño en android.test.suitebuilder.TestSuiteBuilder $ FailedToCreateTests.testSuiteConstructionFailed (TestSuiteBuilder.java:239) – Fedor

Cuestiones relacionadas