android – 带有ActionBarActivity的ActivityUnitTestCase的NameNotFoundException

android – 带有ActionBarActivity的ActivityUnitTestCase的NameNotFoundException,第1张

概述我正在尝试为现有应用程序编写一些测试.我想为测试提供测试应用程序类,我按照示例 here,因为我也使用Dagger进行DI. 但是,如果测试中的活动是ActionBarActivity,则会出现以下异常: java.lang.IllegalArgumentException: android.content.pm.PackageManager$NameNotFoundException: Comp 我正在尝试为现有应用程序编写一些测试.我想为测试提供测试应用程序类,我按照示例 here,因为我也使用Dagger进行DI.

但是,如果测试中的活动是ActionBaractivity,则会出现以下异常:

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

我的测试类如下所示:

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);        ...    }}

该活动出现在AndroIDManifest中,如下所示:

<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>

经过一些故障排除后,我尝试在上面的链接上运行示例,它工作正常,即使我更改活动以扩展ActionBaractivity.

由于我无法找到问题的原因,我也玩了清单,build.gradle等.现在,我只是坚持这个,我想不出别的什么.

This post也可能与问题有关,但也没有任何评论.并且this post似乎也有类似的问题,但那里的解决方案不起作用,因为我不希望真正的应用程序与活动一起启动.

编辑:

我创建了一个简单的单独项目,以便隔离问题.

首先,我为一个扩展ActionBaractivity的Activity编写了一个ActivityUnitTestCase.它工作正常.

在那之后,我尝试添加更多的活动,使它们成为彼此的父级.(因此它看起来像我的实际项目).这也很好.

最后,我添加了更多ActivityUnitTestCase类,其中包含与我的实际项目不同的活动,所有活动都扩展了ActionBaractivity,并为所有活动设置了相同的设置,并在两个设备上运行测试,一个是模拟器(Genymotion),另一个是我的物理设备. (Nexus 4)

测试都在模拟器上给出了nameNotFoundException.除了其中一项测试外,所有测试都在物理设备上传递,这让我更加困惑.

解决方法 这一切都归结为ActivityUnitTestCase中的这个 bug.

使用ActivityUnitTestCase.startAcitvity()构建的活动具有指向应用程序包的componentname.因此,当ActionBaractivity检查父活动以更新Up符号时,如果活动不在应用程序“root”包中,则测试会崩溃.

幸运的是,问题描述中提出的解决方法工作正常,因此在修复之前,只需制作ActivityUnitTestCase的本地副本,更新下面定义componentname的行,并确保您的测试用例扩展该类而不是原始的ActivityUnitTestCase.

// replace this linenew Componentname(mActivityClass.getPackage().getname(),mActivityClass.getname());// with thisnew Componentname(getInstrumentation().getTargetContext(),mActivityClass);
总结

以上是内存溢出为你收集整理的android – 带有ActionBarActivity的ActivityUnitTestCase的NameNotFoundException全部内容,希望文章能够帮你解决android – 带有ActionBarActivity的ActivityUnitTestCase的NameNotFoundException所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1136939.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存