繁体   English   中英

Android / Gradle espresso测试没有启动活动

[英]Android/Gradle espresso test not starting activity

我难以说服新的Android构建系统运行测试。 在运行测试时,它会让Unable to resolve activity for: Intent错误已在其他问题中讨论过,但没有任何内容可以修复我的问题。

我已将其剥离,以便我的测试包完全不依赖于我的主程序包( com.wealdtech.app ),但仍然存在启动活动的问题。

我的测试活动:

package com.wealdtech.test;

import android.app.Activity;
import android.os.Bundle;

public class TileLayoutTestActivity extends Activity
{
  @Override
  public void onCreate(final Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
  }
}

我的测试班:

package com.wealdtech.test;

import android.test.ActivityInstrumentationTestCase2;

public class TileLayoutTest extends ActivityInstrumentationTestCase2<TileLayoutTestActivity>
{
  public TileLayoutTest()
  {
    super(TileLayoutTestActivity.class);
  }

  @Override
  protected void setUp() throws Exception
  {
    super.setUp();
    setActivityInitialTouchMode(false);
  }

  public void testNull()
  {
    final TileLayoutTestActivity activity = getActivity();
    activity.finish();
  }

build.gradle的相关部分:

apply plugin: 'android-library'

android {
  compileSdkVersion 19
  buildToolsVersion "19.0.3"

  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
  }

  defaultConfig {
    minSdkVersion 11
    targetSdkVersion 19

    testPackageName "com.wealdtech.test"
    testInstrumentationRunner "com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner"
  }
}

我获得的完整堆栈跟踪是:

java.lang.RuntimeException: Could not launch activity
at com.google.android.apps.common.testing.testrunner.GoogleInstrumentation.startActivitySync(GoogleInstrumentation.java:286)
at android.test.InstrumentationTestCase.launchActivityWithIntent(InstrumentationTestCase.java:119)
at android.test.InstrumentationTestCase.launchActivity(InstrumentationTestCase.java:97)
at android.test.ActivityInstrumentationTestCase2.getActivity(ActivityInstrumentationTestCase2.java:104)
at com.wealdtech.test.TileLayoutTest.testNull(TileLayoutTest.java:21)
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.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentationTestCase2.java:192)
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 com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner.onStart(GoogleInstrumentationTestRunner.java:167)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1701)
Caused by: java.lang.RuntimeException: Unable to resolve activity for: Intent { act=android.intent.action.MAIN flg=0x14000000 cmp=com.wealdtech.test/.TileLayoutTestActivity }
at android.app.Instrumentation.startActivitySync(Instrumentation.java:379)
at com.google.android.apps.common.testing.testrunner.GoogleInstrumentation.access$101(GoogleInstrumentation.java:52)
at com.google.android.apps.common.testing.testrunner.GoogleInstrumentation$2.call(GoogleInstrumentation.java:268)
at com.google.android.apps.common.testing.testrunner.GoogleInstrumentation$2.call(GoogleInstrumentation.java:266)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)

我没有包含我的AndroidManifest.xml因为我读到的所有内容都表明我不需要为TileLayoutTestActivity添加一个意图,但是无论如何我都试图这样做,结果却得到了相同的结果。

我也尝试将Gradle插件从android-library更改为android ,以防引起问题,但同样的结果。

我看不到有关Espresso测试的先决条件或使用Gradle构建系统进行测试的任何文档,我还没有介绍过。 关于我不能在测试中开始活动的任何想法?

对于使用android-library插件的项目,可以说半实时没有使用AndroidManifest.xml 事实上,所有库项目的清单需要编译是这样的:

<manifest package="com.package.yours"/>

创建AAR文件时,将忽略您尝试放入的任何权限或意图。 它是一个图书馆,就像我所知道的那样,图书馆项目的清单中的任何内容都没有进入AAR(如果您也正在制作其中一个,则为JAR)。

但! 在构建推送到设备的测试项目时将使用的清单。 你可以直接在src/androidTest/AndroidManifest.xml转储乱码,gradle也不在乎,但你必须将测试活动添加到src/main/AndroidManifest.xml ,否则./gradlew connectedCheck将抛出运行时异常。

我的项目看起来像这样(它确实如此,我只更改了名称):

src/
  androidTest/
    java/
      com.package.mine/
        TestActivity.java
        VariousTests.java
  main/
    java/
      com.package.mine/
        FancyLibrary.java
    AndroidManifest.xml

这是我的AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.uie.uieanalytics">

    <uses-permission android:name="android.permission.PERM_I_NEED"/>

    <application>
        <activity android:name=".TestActivity" />
    </application>
</manifest>

否则,我和你一样使用相同的测试运行器,我的build.gradle就足够了。

参考其他可以在我来的时候来这个帖子,所以他们不会浪费时间。

  1. 从传统的,遗弃的,丑陋的ActivityInstrumentationTestCase2变为AndroidStudio,Gradle和Espresso 2支持的注释 。这将由Google进一步开发。

  2. 永远忘记ActivityInstrumentationTestCase2吧!

  3. 开始使用@RunWith,@LargeTest,@Test,@rule ...

对于仪器测试,Android构建了两个APK - 一个用于app,另一个用于测试。 如果你把活动放到androidTest风格,那么它属于测试APK。 如果您稍后使用工具(直接或使用ActivityTestRule )启动活动,则Android会在您的应用APK中搜索它并失败,因为应用APK中没有此类活动。

要解决此问题,您可以在应用程序的debug风格中定义测试活动(类和清单)。 然后它将与你的应用程序APK打包,测试将工作得很好。

更新:或 - 正如Austyn Mahoney建议的那样 - 你应该使用InstrumentationRegistry.getInstrumentation().getTargetContex‌​t()来访问应用程序上下文而不是检测上下文。

请更改您能够运行的规则内的活动名称

ActivityTestRule mActivityRule = new ActivityTestRule <>(更改活动名称)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM