2014-06-27 12 views
9

मुझे परीक्षण चलाने के लिए नए एंड्रॉइड बिल्ड सिस्टम को आश्वस्त करने में कठिनाई हो रही है। परीक्षण चलाते समय यह 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 के लिए कोई इरादा जोड़ने की आवश्यकता नहीं है, हालांकि मैंने इसे वैसे भी करने की कोशिश की है और उसी परिणाम के साथ समाप्त हो गया है।

मैंने समस्या उत्पन्न करने के मामले में android-library से android तक ग्रैडल प्लगइन को बदलने का भी प्रयास किया है, लेकिन फिर एक ही परिणाम।

मैं एस्प्रेसो परीक्षण के लिए पूर्व शर्त के बारे में कोई दस्तावेज नहीं देख सकता, या ग्रैडल बिल्ड सिस्टम के साथ परीक्षण कर रहा हूं, जिसे मैंने पहले ही कवर नहीं किया है। कोई भी विचार जिसके लिए मैं परीक्षण के हिस्से के रूप में गतिविधि शुरू नहीं कर सकता?

+0

क्या आप इसके लिए एक फिक्स ढूंढ पाएंगे? मेरी परियोजना पर एक ही मुद्दे में चल रहा है। –

उत्तर

2

android-library प्लगइन का उपयोग करने वाली प्रोजेक्ट के लिए, यह कहने के लिए अर्द्ध सटीक है कि AndroidManifest.xml वास्तव में उपयोग नहीं किया जाता है। वास्तव में सभी एक पुस्तकालय परियोजना के प्रदर्शन में संकलित करने के लिए की जरूरत है यह है:

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

जब अपने आर फ़ाइल बनाई गई है किसी भी अनुमतियाँ या उद्देश्य आप इसे में डाल करने की कोशिश नजरअंदाज कर दिया जाएगा। यह एक पुस्तकालय है, और जैसा कि मैं कह सकता हूं, लाइब्रेरी प्रोजेक्ट के मैनिफेस्ट में कुछ भी इसे एएआर (या यदि आप उनमें से एक बना रहे हैं) में बनाता है।

लेकिन! वह वह मैनिफेस्ट है जिसका उपयोग तब किया जा रहा है जब आप एक परीक्षण प्रोजेक्ट बनाते हैं जो किसी डिवाइस पर धक्का देता है। आप src/androidTest/AndroidManifest.xml में सचमुच गंदे डंप कर सकते हैं और ग्रेडल परवाह नहीं है, लेकिन आपको अपनी टेस्ट गतिविधि src/main/AndroidManifest.xml पर जोड़नी होगी या अन्य ./gradlew connectedCheck रनटाइम अपवाद फेंकने जा रहा है।

मेरे परियोजना (यह वास्तव में, करता है मैं केवल नाम बदल) इस तरह दिखता है:

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

अन्यथा, मैं एक ही परीक्षण का उपयोग कर रहा:

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

और यहाँ मेरी AndroidManifest.xml है आप के रूप में धावक, और मेरे build.gradle पर्याप्त है।

+0

क्या परेशान करना यह है कि एएस इस तथ्य को लेने के लिए प्रतीत नहीं होता है कि कक्षाएं मौजूद हैं और वे लाल के रूप में दिखाई देती हैं। हालांकि उत्तर के लिए धन्यवाद! –

4

अन्य लोगों के लिए संदर्भ जो इस पोस्ट में आ सकते हैं, इसलिए वे समय नहीं खोते हैं।

  1. विरासत से परिवर्तन, परित्यक्त, बदसूरत ActivityInstrumentationTestCase2 एनोटेशन जो AndroidStudio, Gradle और एस्प्रेसो 2. इस गूगल द्वारा आगे विकसित किया जाएगा द्वारा समर्थित है करने के लिए।

  2. उस गतिविधिInstrumentationTestCase2 के बारे में हमेशा के लिए भूल जाओ!

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

2

उपकरण परीक्षण के लिए एंड्रॉयड बनाता दो APK का उपयोग शुरू - अनुप्रयोग के साथ एक और एक परीक्षण के साथ। यदि आप androidTest स्वाद के लिए गतिविधि डालते हैं, तो यह परीक्षण एपीके से संबंधित है। यदि आप उपकरण (या तो सीधे या ActivityTestRule का उपयोग करके) का उपयोग करके एक गतिविधि शुरू करते हैं, तो एंड्रॉइड इसके लिए आपके ऐप एपीके में खोज करता है और विफल रहता है, क्योंकि ऐप एपीके में ऐसी कोई गतिविधि नहीं है।

समस्या को हल करने के लिए आप अपने ऐप के debug स्वाद में एक परीक्षण गतिविधि (कक्षा और प्रकट) परिभाषित कर सकते हैं। फिर यह आपके ऐप एपीके के साथ पैक किया जाएगा और परीक्षण ठीक काम करेंगे।

अद्यतन: या - के रूप में Austyn Mahoney सुझाव दिया - आप उपकरण एक के बजाय एप्लिकेशन संदर्भ का उपयोग करने की InstrumentationRegistry.getInstrumentation().getTargetContex‌​t() उपयोग करना चाहिए।

+0

आपको अपने परीक्षण पैकेज में गतिविधि को परिभाषित करने की आवश्यकता नहीं है, आपको अपना इरादा बनाते समय सही 'संदर्भ' का उपयोग करने की आवश्यकता है। 'इंस्ट्रूमेंटेशन रजिस्ट्री.जेट इंस्ट्रुमेंटेशन) का उपयोग करें। GetTargetContext()' यह उपकरण एपीके के 'संदर्भ' की बजाय ऐप 'संदर्भ' वापस कर देगा। –

+0

धन्यवाद @AustynMahoney! मैंने जवाब अपडेट किया। –

संबंधित मुद्दे