Android/Gradle浓缩咖啡测试未启动活动

Android/Gradle浓缩咖啡测试未启动活动,android,android-gradle-plugin,android-espresso,Android,Android Gradle Plugin,Android Espresso,我很难说服新的Android构建系统运行测试。运行测试时,会出现无法解决活动for:Intent错误,该错误已在其他问题中讨论过,但其中没有解决我的问题 我已经将其剥离,这样我的测试包就根本不依赖于我的主包(com.wealdtech.app),但启动活动时仍然存在问题 我的测试活动: package com.wealdtech.test; import android.app.Activity; import android.os.Bundle; public class TileLayo

我很难说服新的Android构建系统运行测试。运行测试时,会出现
无法解决活动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();
  }
我获得的完整堆栈跟踪是:

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库
更改为
android
,以防出现问题,但同样的结果


我看不到任何关于浓缩咖啡测试或Gradle构建系统测试的先决条件的文档,我还没有介绍过。关于哪些我不能作为测试的一部分启动活动,有什么想法吗?

对于使用
android library
插件的项目,可以半准确地说,
AndroidManifest.xml
没有真正使用。事实上,库项目的清单需要编译的全部内容如下:

<manifest package="com.package.yours"/>
这是我的
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
非常相似。

其他人可以参考我的文章,这样他们就不会浪费时间

  • 从遗留的、废弃的、丑陋的活动InstrumentationTestCase2更改为由AndroidStudio、Gradle和Espresso 2支持的注释。这将由谷歌进一步开发

  • 永远忘了ActivityInstrumentationTestCase2吧

  • 开始使用@RunWith@LargeTest@Test@Rule


  • 对于仪器测试,Android构建了两个APK——一个带有应用程序,另一个带有测试。如果将活动置于
    androidTest
    flavor,则它属于测试APK。如果您稍后使用指令插入(直接或使用
    ActivityTestRule
    )启动活动,则Android会在您的应用程序APK中搜索该活动并失败,因为应用程序APK中没有此类活动

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


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

    请在您可以运行的规则内更改活动名称

    ActivityTestRule MacActivityRule=新ActivityTestRule(
    更改活动名称)

    您是否能够找到此问题的解决方案?在我的项目中遇到同样的问题。有人有解决方案吗?令人恼火的是,AS似乎没有意识到类存在并且它们显示为红色。谢谢你的回答!您不必在测试包中定义活动,只需在创建您的意图时使用正确的
    上下文即可。使用
    InstrumentationRegistry.getInstrumentation().getTargetContext()
    这将返回应用程序
    上下文
    ,而不是instrumentation apk的
    上下文
    src/
      androidTest/
        java/
          com.package.mine/
            TestActivity.java
            VariousTests.java
      main/
        java/
          com.package.mine/
            FancyLibrary.java
        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>