我难以说服新的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构建系统进行测试的任何文档,我尚未涵盖这些内容。关于我不能在测试中开始活动的任何想法?
答案 0 :(得分:4)
对于使用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 :(得分:4)
在我来的时候可以参加这个帖子的其他人的参考,所以他们不会浪费时间。
从传统的,遗弃的,丑陋的ActivityInstrumentationTestCase2变为注释,这是由AndroidStudio,Gradle和Espresso 2支持的。这将由Google进一步开发。
永远忘记ActivityInstrumentationTestCase2!
开始使用 @RunWith , @LargeTest , @Test , @Rule ...
答案 2 :(得分:2)
对于测试测试,Android会构建两个APK - 一个使用应用程序,另一个使用测试。如果您将活动设置为androidTest
味道,那么它属于测试APK。如果您稍后使用工具(直接或使用ActivityTestRule
)启动活动,那么Android会在您的应用APK中搜索它并失败,因为应用APK中没有此类活动。
要解决此问题,您可以在应用的debug
风格中定义测试活动(类和清单)。然后它将与您的应用程序APK打包,测试将正常工作。
更新:或 - 正如Austyn Mahoney所建议的那样 - 您应该使用InstrumentationRegistry.getInstrumentation().getTargetContext()
来访问应用程序上下文而不是检测上下文。
答案 3 :(得分:1)
在您可以运行的规则中更改活动名称
ActivityTestRule mActivityRule =新的ActivityTestRule <>( 更改活动名称)