簡體   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