gpt4 book ai didi

android - NameNotFoundException 在 ActivityUnitTestCase 与 ActionBarActivity

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:23:18 24 4
gpt4 key购买 nike

我正在尝试为现有应用程序编写一些测试。我想为测试提供一个测试应用程序类,我遵循了示例 here ,因为我也在使用 Dagger 进行 DI。

但是,如果被测 Activity 是 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);
...
}
}

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

经过一些故障排除后,我尝试运行上面链接中的示例,它工作正常,即使我更改 Activity 以扩展 ActionBarActivity。

由于找不到问题的原因,我还尝试了 manifest、build.gradle 等。现在,我只是受困于此,我想不出其他任何东西。

This post也可能与问题有关,但也没有对此发表任何评论。和 this post似乎也有类似的问题,但那里的解决方案对我不起作用,因为我不希望真正的应用程序随 Activity 一起启动。

编辑:

为了隔离问题,我创建了一个简单的单独项目。

首先,我为扩展 ActionBarActivity 的 Activity 编写了一个 ActivityUnitTestCase。它运行良好。

之后,我尝试添加更多 Activity ,使它们成为彼此的父项。(这样它看起来就像我的实际项目)。这也很管用。

最后,我添加了更多 ActivityUnitTestCase 类,这些类具有与我的实际项目不同的 Activity ,所有类都扩展了 ActionBarActivity,所有这些都具有相同的设置,并在两个设备上运行测试,一个是模拟器 (Genymotion),另一个是是我的物理设备。 (连结 4)

测试都在模拟器上给出了 NameNotFoundException。除了一项测试外,所有测试都在物理设备上通过,这让我更加困惑。

最佳答案

这一切都归结为这个bugActivityUnitTestCase 中。

使用 ActivityUnitTestCase.startAcitvity() 构建的 Activity 有一个指向应用程序包的 componentName。因此,当 ActionBarActivity 检查父 Activity 以更新向上符号时,如果该 Activity 不在应用程序“根”包中,则测试会崩溃。

幸运的是,问题描述中提出的解决方法工作得很好,所以在这个问题得到解决之前,只需制作一个 ActivityUnitTestCase 的本地副本,更新 componentName 所在的行定义如下,并确保您的测试用例扩展该类而不是原始的 ActivityUnitTestCase

// replace this line
new ComponentName(mActivityClass.getPackage().getName(), mActivityClass.getName());

// with this
new ComponentName(getInstrumentation().getTargetContext(), mActivityClass);

关于android - NameNotFoundException 在 ActivityUnitTestCase 与 ActionBarActivity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24760354/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com