Android / Gradle咖啡testing不开始活动

我难以说服新的Android构build系统运行testing。 在运行testing时,它给出Unable to resolve activity for: Intent错误已经在其他问题中讨论过,但没有什么能够解决我的问题。

我已经剥离下来,所以我的testing包不依赖于我的主包( com.wealdtech.app ),但仍然有问题开始活动。

我的testing活动:

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

而我的testingclass:

 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添加一个意图,但是我试图做到这一点,并以相同的结果结束。

我也曾尝试更改从android-libraryandroid的Gradle插件的情况下,导致了这个问题,但也是相同的结果。

我看不到有关Espressotesting的先决条件的任何文档,或者使用我尚未涉及的Gradle构build系统进行testing。 任何想法,我不能作为testing的一部分开始活动?

Solutions Collecting From Web of "Android / Gradle咖啡testing不开始活动"

参考其他谁可以来到这个职位,所以他们不会失去时间。

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

  2. 忘记那个ActivityInstrumentationTestCase2永远!

  3. 开始使用@RunWith@ LargeTest@ Test@ Rule

对于使用android-library插件的项目来说, AndroidManifest.xml没有被真正使用,这是半准确的。 实际上所有的图书馆项目的清单都需要编译的是:

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

当您创buildAAR文件时,您尝试放入的任何权限或意图都将被忽略。 它是一个图书馆,就我所知,在图书馆项目的清单中没有任何东西能够进入AAR(或者也可以是JAR)。

但! 这在build立一个被推送到设备上的testing项目时要使用的清单。 你可以直接在src/androidTest/AndroidManifest.xml转储乱码,而gradle不会在乎,但是你必须把你的testing活动添加到src/main/AndroidManifest.xml ,否则./gradlew connectedCheck会抛出运行时exception。

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

 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> 

否则,我使用和你一样的testing运行器,而我的build.gradle是相似的。

对于仪器testing,Android构build了两个APK – 一个与应用程序和一个testing。 如果您将活动放置到androidTest风格,那么它属于testingAPK。 如果稍后使用检测(直接或通过使用ActivityTestRule )启动一个活动,则Android会在您的应用APK中search并失败,因为应用APK中没有这样的活动。

为了解决这个问题,你可以在应用程序的debug风格中定义一个testing活动(类和清单)。 然后它将与您的应用程序APK包装和testing将工作得很好。

更新:或者 – 如Austyn Mahoney所build议的那样 – 您应该使用InstrumentationRegistry.getInstrumentation().getTargetContex‌​t()来访问应用程序上下文,而不是使用InstrumentationRegistry.getInstrumentation().getTargetContex‌​t()