7

मैं मौजूदा एप्लिकेशन के लिए कुछ परीक्षण लिखने की कोशिश कर रहा हूं। मैं परीक्षणों के लिए एक परीक्षण आवेदन कक्षा की आपूर्ति करना चाहता था और उदाहरण के बाद मैंने here का उदाहरण दिया, क्योंकि मैं डी के लिए डैगर का भी उपयोग कर रहा हूं।ActionNotFoundException ActivityUnitTestCase पर ActionBarActivity

हालांकि, अगर परीक्षण के अंतर्गत गतिविधि एक ActionBarActivity है, मैं निम्नलिखित अपवाद: इस प्रकार

public class MyActivityTest extends ActivityUnitTestCase<MyActivity> { 

    ... 

    public MyActivityTest() { 
     super(MyActivity.class); 
    } 

    private Context context; 

    private TestBaseApplication application; 

    @Override 
    protected void setUp() throws Exception { 
     super.setUp(); 
     context = new ContextThemeWrapper(getInstrumentation().getTargetContext(), R.style.Theme_AppCompat){ 
      @Override 
      public Context getApplicationContext() { 
       return application; 
      } 
     }; 
     application = new TestBaseApplication(context); 
     setApplication(application); 

     ... 
    } 

    public void test() throws InterruptedException { 
     setActivityContext(context); 
     Intent intent = new Intent(context, MyActivity.class); 
     startActivity(intent, null, null); 
     ... 
    } 
} 

गतिविधि AndroidManifest में प्रकट होता है:

java.lang.IllegalArgumentException: android.content.pm.PackageManager$NameNotFoundException: ComponentInfo{mypackage.view.activity/mypackage.view.activity.MyActivity} 
at android.support.v4.app.NavUtils.getParentActivityName(NavUtils.java:282) 
at android.support.v7.app.ActionBarActivityDelegate.onCreate(ActionBarActivityDelegate.java:116) 
at android.support.v7.app.ActionBarActivityDelegateICS.onCreate(ActionBarActivityDelegateICS.java:57) 
at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:98) 
at mypackage.view.activity.MyActivity.onCreate(MyActivity.java:68) 
at android.app.Activity.performCreate(Activity.java:5231) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
at android.test.ActivityUnitTestCase.startActivity(ActivityUnitTestCase.java:158) 
at mypackage.MyActivityTest.test(MyActivityTest.java:89) 
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.AndroidTestRunner.runTest(AndroidTestRunner.java:191) 
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176) 
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:554) 
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1701) 
Caused by: android.content.pm.PackageManager$NameNotFoundException: ComponentInfo{mypackage.view.activity/mypackage.view.activity.MyActivity} 
at android.app.ApplicationPackageManager.getActivityInfo(ApplicationPackageManager.java:242) 
at android.support.v4.app.NavUtils.getParentActivityName(NavUtils.java:298) 
at android.support.v4.app.NavUtils.getParentActivityName(NavUtils.java:279) 
... 21 more 

मेरा परीक्षण वर्ग इस प्रकार की तरह दिखता है :

<activity 
      android:name=".view.activity.MyActivity" 
      android:icon="@drawable/actionbar_logo" 
      android:screenOrientation="portrait" 
      android:parentActivityName="mypackage.ParentActivity"> 
      <meta-data android:name="android.support.PARENT_ACTIVITY" 
       android:value="mypackage.ParentActivity"/> 
     </activity> 

कुछ समस्या निवारण के बाद, मैंने पूर्व चलाने की कोशिश की ऊपर दिए गए लिंक पर पर्याप्त है और यह ठीक काम करता है, भले ही मैं एक्शनबार एक्टिविटी बढ़ाने के लिए गतिविधि बदलूं।

चूंकि मैं समस्या का कारण नहीं ढूंढ पाया, इसलिए मैंने मैनिफेस्ट, build.gradle आदि के साथ भी खेला। अब, मैं बस इसके साथ फंस गया हूं और मैं कुछ और नहीं सोच सकता।

This post समस्या से संबंधित भी हो सकता है, लेकिन उस पर कोई टिप्पणी नहीं है। और this post में भी इसी तरह की समस्या प्रतीत होती है लेकिन समाधान वहां काम नहीं करता है क्योंकि मैं नहीं चाहता कि वास्तविक एप्लिकेशन गतिविधि के साथ लॉन्च किया जाए।

संपादित:

मैं एक साधारण अलग परियोजना बना लिया है इस समस्या को अलग करने के लिए में,।

सबसे पहले मैंने एक्शनबैरएक्टिविटी को विस्तारित करने वाली गतिविधि के लिए एक गतिविधि UnnTestCase लिखा है। यह ठीक काम किया।

इसके बाद, मैंने कुछ और गतिविधियों को जोड़ने की कोशिश की है, जिससे उन्हें एक-दूसरे के माता-पिता बनाते हैं। (ताकि यह मेरी वास्तविक परियोजना की तरह दिख सके)। और यह भी ठीक काम किया।

आखिरकार, मैंने अपनी वास्तविक परियोजना से अलग-अलग गतिविधियों के साथ अधिक गतिविधिUnitTestCase कक्षाएं जोड़ दी हैं, सभी एक्शनबार एक्टिविटी, सभी के लिए एक ही सेटअप के साथ, और दो उपकरणों पर परीक्षण चलाएं, एक एमुलेटर (जीनिमशन) और एक दूसरा मेरा भौतिक उपकरण है। (नेक्सस 4)

टेस्ट सभी ने एमुलेटर पर NameNotFoundException दिया। भौतिक उपकरण पर पारित परीक्षणों में से एक, जिसने मुझे और भी भ्रमित कर दिया।

+1

अगर मुझे लगता है कि यह ऐपकॉम्पेट माता-पिता की गतिविधि को देखता है, तो केवल एक उपकरण की जांच से 'संदर्भ' का उपयोग करते समय देखा जाता है। लेकिन यह सिर्फ एक अनुमान है। आप यह देखने के लिए कि क्या आप इसे अलगाव में पुन: उत्पन्न कर सकते हैं, एक छोटी अलग परियोजना (और परीक्षण) बनाने का प्रयास कर सकते हैं। यदि आप कर सकते हैं, और आप सुनिश्चित हैं कि आप 'appcompat-v7' के नवीनतम संस्करण पर हैं, नमूना प्रोजेक्ट और स्टैक ट्रेस के साथ [समस्या ट्रैकर] (http://b.android.com) पर कोई समस्या दर्ज करें । – CommonsWare

+0

@ कॉमन्सवेयर: टिप्पणी के लिए धन्यवाद। अपने सुझावों के परिणामों के साथ मेरी पोस्ट अपडेट की गई। आपके जैसा सुझाव हो सकता है कि एक बग हो सकता है लेकिन निश्चित रूप से इसे एक अलग परियोजना में पुन: उत्पन्न नहीं कर सकता है, जैसे कि मैं कोई समस्या दर्ज कर सकता हूं। –

+0

दुर्भाग्य से, यह किसी की भी मदद करने की क्षमता को सीमित करता है, क्योंकि हम इसे पुन: उत्पन्न करने में सक्षम होने की संभावना नहीं रखते हैं। :-( – CommonsWare

उत्तर

10

यह ActivityUnitTestCase में bug पर आता है।

ActivityUnitTestCase.startAcitvity() का उपयोग करके बनाई गई गतिविधियां घटक नाम एप्लिकेशन पैकेज पर इंगित करती हैं। तो जब ActionBarActivity ऊपर प्रतीक को अपडेट करने के लिए अभिभावक गतिविधि के लिए जांच करता है, तो गतिविधि ऐप 'रूट' पैकेज में नहीं है तो परीक्षण क्रैश हो जाता है।

सौभाग्य से वैकल्पिक हल मुद्दा वर्णन में प्रस्तावित बस ठीक काम करता है, इसलिए जब तक यह तय हो गई है, बस ActivityUnitTestCase की स्थानीय प्रतिलिपि बनाने के लिए, लाइन, जिसमें componentName नीचे के रूप में परिभाषित किया गया है अपडेट करते हैं और सुनिश्चित करें कि आपके परीक्षण मामलों बनाने मूल ActivityUnitTestCase के बजाय उस वर्ग का विस्तार करें।

// replace this line 
new ComponentName(mActivityClass.getPackage().getName(), mActivityClass.getName()); 

// with this 
new ComponentName(getInstrumentation().getTargetContext(), mActivityClass); 
+1

इसके लिए धन्यवाद, यह वास्तव में मेरी मदद करता है। :) मैंने अभी ActivityUnitTestCase की प्रतिलिपि बनाई है और लाइन को "घटक नाम सीएन = नया घटक नाम (getInstrumentation()। GetTargetContext(), mActivityClass) में बदल दिया है;" – scrrr

+0

या आप गतिविधि को रूट पैकेज में ले जा सकते हैं, लेकिन यह समाधान आदर्श से कम हो सकता है –

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