无法解析活动:Intent when instrumentation-testing android activities。

4
我在安卓上运行测试时遇到错误。我写了一个Activity,名为,它位于包中,现在我正在尝试测试该项目的GUI,但出现以下错误: java.lang.RuntimeException: Unable to resolve activity for: Intent { act=android.intent.action.MAIN flg=0x10000000 cmp=com.mycompany.mobile.android.gui/.AudioPlayerActivity } 我已经阅读了这篇问题,并遵循了那里的建议,但仍无济于事。我还在谷歌上搜索了这个错误,但没有找到任何帮助。 这是我的测试项目的AndroidManifest.xml文件的外观:
<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mycompany.mobile.android.gui"
    android:versionCode="1"
    android:versionName="1.0" >

    <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.mycompany.mobile.android.gui" />
    <application>
        <uses-library android:name="android.test.runner" />
    </application>

    <uses-sdk android:targetSdkVersion="7" />
    <supports-screens android:anyDensity="true" />
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
</manifest>

这是我的仪表测试。

包 com.mycompany.mobile.android.gui;

import android.test.ActivityInstrumentationTestCase2;

import com.mycompany.mobile.android.gui.AudioPlayerActivity;

public class TestMusicPlayerActivityTest extends ActivityInstrumentationTestCase2<AudioPlayerActivity> {
    public TestMusicPlayerActivityTest() {
            super("com.mycompany.mobile.android.gui", AudioPlayerActivity.class);
    }

    public TestMusicPlayerActivityTest(String name) {
        super("com.mycompany.mobile.android.gui", AudioPlayerActivity.class);
    }

    public TestMusicPlayerActivityTest(String pkg, Class<AudioPlayerActivity> activityClass) {
        super("com.mycompany.mobile.android.gui", AudioPlayerActivity.class);
    }

    public void testSomething() {
        System.out.println("Nothing works :(");
        System.out.println(getActivity());
    }   
}

我们正在通过maven运行整个过程,但这不应该是问题的一部分。
如您所见,被测试的Activity也位于同一包中。我没有像大多数遇到此问题的人那样使用activity代替包名称调用超级构造函数。
有趣的是,这是描述被测试Activity的AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mycompany.mobile.android.gui"
    android:versionCode="1"
    android:versionName="1.0" >

    <!-- omitted Uses permission + Uses SDK -->
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:debuggable="true"
        android:theme="@style/NoTitleBar"
    >
    <!-- omitted other activities -->
        <activity 
            android:name="com.mycompany.mobile.android.gui.AudioPlayerActivity"
            android:screenOrientation="portrait" ></activity>
    </application>
</manifest>

我还将该活动添加到了AndroidManifest.xml中,但是这并没有改变任何事情。我还尝试为所需的活动添加MAIN/LAUNCHER意图过滤器,但是这并没有改变测试结果。我已经尝试使用extra启动活动,也尝试不使用它们启动,但这也没有改变结果。

3个回答

6
<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.mycompany.mobile.android.gui"
... ...

你的Android项目和Android测试项目是否使用相同的包名?这可能是个问题,但我不确定它是否会导致java.lang.RuntimeException。
根据官方开发指南此处,你的测试项目必须与被测试的项目有不同的包名:
引用如下: 一个Android包名是.apk文件的唯一系统名称,由元素中的“android:package”属性设置。你的测试包的Android包名必须与被测试应用程序的Android包名不同。默认情况下,Android工具通过将“.test”附加到被测试应用程序的包名来创建测试包名。
尝试为你的测试项目使用包名com.mycompany.mobile.android.gui.test。

这现在是无效的。 - Rachit Mishra

1

有两种可能的解决方案。

  1. 在Android清单中添加活动定义并标记为已导出。

如果您忘记在Android清单中定义活动,则会收到“无法解析活动错误”。如果您正在创建Android测试项目中的单独测试活动,请创建一个单独的测试子包并在其中创建活动。之后将其包含在Android清单中并将其标记为已导出。

# folder structure
└── src
    └── androidTest
        └── java
            └── com
                └── example
                    └── test
                        └── TestActivity.kt


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.example.test">
  <application>
     <activity
       android:name=".TestActivity"
       android:exported="true" />
  </application>
</manifest>

默认情况下,Android Gradle插件会将“.test”附加到测试应用程序的“applicationId”和“namespace”上。因此,您需要将所有类放在单独的测试包中。
2.更改Android测试“命名空间”和“applicationId”。
您可以在模块级别的 build.gradle 文件中定义测试应用程序的“命名空间”和“applicationId”。将其设置为与测试应用程序的包名称匹配。
android {
  testNamespace 'com.example.app'
  defaultConfig {
     testApplicationId 'com.example.app'
  }
}

建议在namespaceapplicationId中使用相同的值。如果使用不同的值,Android Gradle插件将在Android清单中将applicationId复制到namespace的位置。


0

您正在运行它作为一个Android项目,请尝试将其作为Android测试项目运行

adb shell am instrument -e package <java包名> -w <测试apk包名>/android.test.InstrumentationTestRunner


就像我之前说的,我是通过Maven来运行它的。我已经在这里粘贴了pom.xml文件(链接:http://pastie.org/private/a91ur2skgambknh2cryhba)。删除testSourceDirectory和sourceDirectory文件夹并没有改变结果。 - wonderb0lt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接