NameNotFoundException en ActivityUnitTestCase con ActionBarActivity

Estoy tratando de escribir algunas pruebas para una aplicación existente. Quería proporcionar una prueba de la clase de aplicación a las pruebas y he seguido el ejemplo aquí , ya que también estoy usando Dagger para DI.

Sin embargo, si la actividad bajo prueba es ActionBarActivity, obtengo la siguiente excepción:

java.lang.IllegalArgumentException: android.content.pm.PackageManager$NameNotFoundException: ComponentInfo{mypackage.view.activity/mypackage.view.activity.MyActivity} at android.support.v4.app.NavUtils.getParentActivityName(NavUtils.java:282) at android.support.v7.app.ActionBarActivityDelegate.onCreate(ActionBarActivityDelegate.java:116) at android.support.v7.app.ActionBarActivityDelegateICS.onCreate(ActionBarActivityDelegateICS.java:57) at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:98) at mypackage.view.activity.MyActivity.onCreate(MyActivity.java:68) at android.app.Activity.performCreate(Activity.java:5231) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) at android.test.ActivityUnitTestCase.startActivity(ActivityUnitTestCase.java:158) at mypackage.MyActivityTest.test(MyActivityTest.java:89) 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.AndroidTestRunner.runTest(AndroidTestRunner.java:191) at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176) at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:554) at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1701) Caused by: android.content.pm.PackageManager$NameNotFoundException: ComponentInfo{mypackage.view.activity/mypackage.view.activity.MyActivity} at android.app.ApplicationPackageManager.getActivityInfo(ApplicationPackageManager.java:242) at android.support.v4.app.NavUtils.getParentActivityName(NavUtils.java:298) at android.support.v4.app.NavUtils.getParentActivityName(NavUtils.java:279) ... 21 more 

Mi clase de prueba se ve como sigue:

 public class MyActivityTest extends ActivityUnitTestCase<MyActivity> { ... public MyActivityTest() { super(MyActivity.class); } private Context context; private TestBaseApplication application; @Override protected void setUp() throws Exception { super.setUp(); context = new ContextThemeWrapper( getInstrumentation().getTargetContext(), R.style.Theme_AppCompat){ @Override public Context getApplicationContext() { return application; } }; application = new TestBaseApplication( context); setApplication(application); ... } public void test() throws InterruptedException { setActivityContext( context); Intent intent = new Intent( context, MyActivity.class); startActivity(intent, null, null); ... } } 

La actividad aparece en el AndroidManifest de la siguiente manera:

 <activity android:name=".view.activity.MyActivity" android:icon="@drawable/actionbar_logo" android:screenOrientation="portrait" android:parentActivityName="mypackage.ParentActivity"> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="mypackage.ParentActivity"/> </activity> 

Después de solucionar algunos problemas, intenté ejecutar el ejemplo en el enlace anterior y funciona muy bien, incluso cuando cambie la actividad para extender ActionBarActivity.

Puesto que no podía encontrar la causa del problema, también jugé alrededor con el manifiesto, build.gradle, el etc. Ahora, soy apenas pegado con esto y no puedo pensar en cualquier otra cosa.

Este mensaje también puede estar cerca de relacionado con el problema, pero no hay ningún comentario sobre ese tampoco. Y este post también parecía tener un problema similar, pero la solución no me funciona, ya que no quiero que la aplicación real para ser lanzado con la actividad.

EDIT :

He creado un simple proyecto independiente, con el fin de aislar el problema.

Primero he escrito un ActivityUnitTestCase para una actividad que extiende ActionBarActivity. Funcionó bien.

Después de eso, he intentado agregar algunas actividades más, haciéndolos padres unos de otros (para que se vea como mi proyecto real). Y eso funcionó bien también.

Por último, he añadido más clases de ActivityUnitTestCase con diferentes actividades de mi proyecto actual, todas extendiendo ActionBarActivity, con la misma configuración para todas ellas, y ejecutar las pruebas en dos dispositivos, uno que es un emulador (Genymotion) y el otro es mi físico dispositivo. (Nexus 4)

Todas las pruebas dieron la excepción NameNotFoundException en el emulador. Todos menos uno de los exámenes pasaron por el dispositivo físico, lo que me hizo aún más confuso.

Todo se reduce a este error en ActivityUnitTestCase .

Las actividades creadas con ActivityUnitTestCase.startAcitvity() tienen un nombre de componente que apunta al paquete de aplicación. Por lo tanto, cuando ActionBarActivity comprueba si una actividad principal actualiza el símbolo Subir, la prueba se bloquea si la actividad no se encuentra en el paquete "raíz" de la aplicación.

Afortunadamente, la solución propuesta en la descripción del problema funciona bien, por lo que hasta que se resuelva, haga una copia local de ActivityUnitTestCase , actualice la línea en la que se define el componentName como a continuación y asegúrese de que los casos de prueba amplíen esa clase en lugar de Original ActivityUnitTestCase .

 // replace this line new ComponentName(mActivityClass.getPackage().getName(), mActivityClass.getName()); // with this new ComponentName(getInstrumentation().getTargetContext(), mActivityClass); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.