2014-06-27 3 views
9

Ich habe Schwierigkeiten, die neue Android-Build-System zu Tests zu überzeugen. Beim Ausführen des Tests gibt es den Fehler Unable to resolve activity for: Intent, der in anderen Fragen diskutiert wurde, aber es gibt nichts darin, das mein Problem behoben hat.Android/Gradle Espresso Test nicht starten Aktivität

Ich habe es abgestreift, so dass mein Testpaket überhaupt nicht auf mein Hauptpaket (com.wealdtech.app) angewiesen ist, aber immer noch das Problem hat, Aktivität zu starten.

Meine Testaktivität:

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

Und meine Testklasse:

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

Relevante Teile 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" 
    } 
} 

Das vollständige Stack-Trace I erhalten ist:

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) 

Ich habe meine AndroidManifest.xml nicht enthalten, weil alles, was ich lese schlägt vor, dass ich keine Absicht für TileLayoutTestActivity hinzufügen muss, jedoch habe ich versucht, dies trotzdem zu tun und endete mit dem gleichen Ergebnis.

Ich habe auch versucht, das Gradle-Plugin von android-library zu android zu ändern, falls das Problem verursacht wurde, aber wieder das gleiche Ergebnis.

Ich kann keine Dokumentation in Bezug auf die Voraussetzungen für Espresso-Tests oder Tests mit dem Gradle-Build-System sehen, die ich nicht bereits behandelt habe. Irgendwelche Ideen, zu denen ich die Tätigkeit als Teil des Tests nicht beginnen kann?

+0

Konnten Sie eine Lösung dafür finden? Das gleiche Problem in meinem Projekt. –

Antwort

2

Für ein Projekt, das das android-library-Plugin verwendet, ist es semi-genau zu sagen, dass die AndroidManifest.xml nicht wirklich verwendet wird. In der Tat alle das Manifest einer Bibliothek Projekt kompilieren muss, ist dies:

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

Alle Berechtigungen oder Absichten Sie versuchen, in sie zu setzen, werden ignoriert, wenn die Ihre AAR-Datei erstellt wird. Da es sich um eine Bibliothek handelt, und so weit ich es beurteilen kann, gelangt nichts in das Manifest des Bibliotheksprojekts in die AAR (oder JAR, wenn Sie eine davon machen).

Aber! Das ist das Manifest, das verwendet wird, wenn Sie ein Testprojekt erstellen, das an ein Gerät gesendet wird. Sie können buchstäblich Kauderwelsch in src/androidTest/AndroidManifest.xml ausgeben und Gradle wird nicht interessieren, aber Sie müssen Ihre Testaktivität zu src/main/AndroidManifest.xml hinzufügen oder sonst wird Laufzeitausnahmen werfen.

Mein Projekt sieht wie folgt aus (es wirklich der Fall ist, änderte ich nur die Namen):

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

Und hier ist mein 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> 

Ansonsten bin ich den gleichen Test mit Läufer wie Sie, und meine build.gradle ist ähnlich genug.

+0

Was ärgerlich ist, ist, dass AS die Tatsache, dass die Klassen existieren, nicht annimmt und sie als rot erscheinen. Danke für die Antwort! –

4

Hinweis für andere, die zu diesem Beitrag kommen können, als ich kam, damit sie nicht die Zeit verlieren.

  1. Wechsel von Vermächtnis, verließ, hässlich ActivityInstrumentationTestCase2 zu Anmerkungen, die von Android Studio, Gradle und Espresso unterstützt wird 2. Dies wird von Google entwickelt werden.

  2. Vergessen Sie diese ActivityInstrumentationTestCase2 für immer!

  3. Start mit @RunWith, @LargeTest, @Test, @Rule ...

2

Für Instrumentierung Tests Android zwei APK baut - eine mit der App und ein mit den Tests. Wenn Sie Aktivität auf androidTest Geschmack legen, dann gehört es zum Test APK. Wenn Sie zu einem späteren Zeitpunkt eine Aktivität mit Instrumentierung starten (entweder direkt oder mithilfe von ActivityTestRule), sucht Android in Ihrer App nach APK und schlägt fehl, da es in der App-APK keine solche Aktivität gibt.

Um das Problem zu lösen, können Sie eine Testaktivität (Klasse und Manifest) in der debug Geschmacksrichtung Ihrer App definieren. Dann wird es mit Ihrer App APK gepackt und Tests werden gut funktionieren.

Update: oder - wie Austyn Mahoney vorgeschlagen - Sie sollten InstrumentationRegistry.getInstrumentation().getTargetContex‌​t() verwenden, um auf den App-Kontext statt Instrumentation eins zugreifen.

+0

Sie müssen die Aktivität nicht in Ihrem Testpaket definieren, Sie müssen nur den richtigen "Kontext" verwenden, wenn Sie Ihre Absicht erstellen. Benutze 'InstrumentationRegistry.getInstrumentation(). GetTargetContext()' Dies wird die App 'Context' zurückgeben und nicht den' Context' der Instrumentierungs-App. –

+0

Danke @AustynMahoney! Ich habe die Antwort aktualisiert. –