2011-08-05 11 views
5

मैं एंड्रॉइड परीक्षण सामग्री के लिए नया हूँ। मैं परीक्षण करना चाहता हूं कि बटन पर क्लिक करने से संबंधित गतिविधि खुल जाएगी या नहीं। मैंने कुछ शोध किया और पाया कि मुझे जांच करने के लिए ActivityManager का उपयोग करने की आवश्यकता होगी।एंड्रॉइड JUnit परीक्षण केस में Button.perform पर क्लिक करें?

समस्या यह है कि, मुझे "क्लिक" भाग काम नहीं मिल रहा है। मैं Button.performClick() का उपयोग करने की कोशिश कर रहा हूं।

प्रारंभ में मैंने अभी यह फ़ंक्शन कहा था, और यह कहने में एक त्रुटि मिली कि मैं वर्तमान धागे में ऐसा नहीं कर सकता। कुछ googling के बाद मुझे पता चला कि मुझे इसे यूआई थ्रेड में कॉल करने की आवश्यकता है, और runOnUiThread(Runnable r) method पर आया।

मैं जिस बटन को क्लिक करने का प्रयास कर रहा हूं वह _helloButton_ है। यह _setUp()_ method में प्राप्त किया जाता है। मैंने _assertNotNull_ पर यह सुनिश्चित करने के लिए जांच की है कि यह वहां है।

एक परीक्षा पद्धति के भीतर, मैं

mActivity.runOnUiThread(new Runnable() { 
     public void run() { 
      helloButton.requestFocus(); 
     } 
    }); 
helloButton.performClick(); 

संपर्क करें, मैं लाइन requestFocus() बुला पर एक एनपीई मिलता है।

अगला मैं

mActivity.runOnUiThread(new Runnable() { 
     public void run() { 
      helloButton.performClick(); 
     } 
    }); 

की कोशिश की और अब भी वही नल पॉइंटर एक्सेप्शन मिलता है।

JUnit परिप्रेक्ष्य पर, मैं यह संदेश प्राप्त

Test failed to run to completion. Reason: 'Instrumentation run failed due to 'java.lang.NullPointerException''. Check device logcat for details 

और स्टैकट्रेस इस तरह दिखेगा।

08-05 19:03:11.922: ERROR/AndroidRuntime(578): Uncaught handler: thread main exiting due to uncaught exception 
08-05 19:03:11.922: ERROR/AndroidRuntime(578): java.lang.NullPointerException 
08-05 19:03:11.922: ERROR/AndroidRuntime(578):  at com.example.helloworldmk2.test.HelloWorldMK2Test$1.run(HelloWorldMK2Test.java:57) 
08-05 19:03:11.922: ERROR/AndroidRuntime(578):  at android.os.Handler.handleCallback(Handler.java:587) 
08-05 19:03:11.922: ERROR/AndroidRuntime(578):  at android.os.Handler.dispatchMessage(Handler.java:92) 
08-05 19:03:11.922: ERROR/AndroidRuntime(578):  at android.os.Looper.loop(Looper.java:123) 
08-05 19:03:11.922: ERROR/AndroidRuntime(578):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
08-05 19:03:11.922: ERROR/AndroidRuntime(578):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-05 19:03:11.922: ERROR/AndroidRuntime(578):  at java.lang.reflect.Method.invoke(Method.java:521) 
08-05 19:03:11.922: ERROR/AndroidRuntime(578):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
08-05 19:03:11.922: ERROR/AndroidRuntime(578):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
08-05 19:03:11.922: ERROR/AndroidRuntime(578):  at dalvik.system.NativeStart.main(Native Method) 

रेखा 57 वह जगह है जहां मैं helloButton.performClick() पर कॉल कर रहा हूं।

मुझे यकीन नहीं है कि मुझे एनपीई क्यों मिल रहा है; assertNotNull बिना किसी समस्या के गुजरता है। यदि आप इस मुद्दे के साथ मेरी मदद कर सकते हैं, तो मैं वास्तव में इसकी सराहना करता हूं। अग्रिम में धन्यवाद।

संपादित करें: मैं इस विशेष परीक्षण कक्षा के लिए ActivityInstrumentationTestCase2 subclassing कर रहा हूँ।

EDIT2: एनपीई होने से पहले लॉगकैट कुछ त्रुटियों को बाहर निकाल देता है।

मैं देख रहा हूँ

08-05 20: 08: 54.702: त्रुटि/AndroidRuntime (754): त्रुटि: धागा देते विफल रही

और

08-05 20: 08: 58.642: त्रुटि/gralloc (52): [unregister] 0x3e1b28 को अभी भी लॉक करें (राज्य = 40000001)

+0

स्पष्टीकरण के लिए, आप एक बटन है कि एक नई गतिविधि के शुभारंभ को गति प्रदान करेगा प्रेस करना चाहते हैं विधि का उपयोग कर सकते हैं? –

+0

हां। बटन पर ऑनक्लिक लिस्टनर है, जो एक और गतिविधि शुरू करता है। –

उत्तर

15

आप यूआई धागे पर चलाने के लिए अपने परीक्षण टिप्पणी कर सकते हैं:

@UiThreadTest 
public void testNoErrorInCapitalization() { 
    final String msg = "this is a sample"; 
    mMessage.setText(msg); 
    mCapitalize.performClick(); 
    final String actual = mMessage.getText().toString(); 
    final String notExpectedRegexp = "(?i:ERROR)"; 
    assertNotContainsRegex("Capitalization found error:", 
     notExpectedRegexp, actual); 
} 

यह Android Application Testing Guide से लिया गया एक उदाहरण है।

+0

आपने अभी अपना दिन सर बचाया है। धन्यवाद! –

-1

आप एक साधारण समस्या के लिए बहुत कठिन दृष्टिकोण ले रहे हैं ...अनिवार्य रूप से आप की जरूरत इस तरह से संरचित कोड सावधान, इस sudo कोड है और कार्य नहीं करेगा

public void myOnClickListener(View source) { 

    switch source.getId() { 
    case R.id.Your_Button_Name_In_Xml : 
    Intent MyNewActivity = new Intent(this, MyNewClass.class); 
    startActivity(MyNewActivity); 
    } 
} 

जांच यह पता http://learnandroid.blogspot.com/2008/01/opening-new-screen-in-android.html

+0

मुझे पता है कि यह तरीका कैसे काम करता है, लेकिन वास्तव में यह नहीं है कि मुझे यहां क्या करना है। यह एक जुनीट टेस्ट केस है; सभी बटन क्लिक श्रोताओं को पहले ही परिभाषित किया गया है। मुझे बस टेस्ट केस विधि में क्लिक करने में सक्षम होना चाहिए। –

0

तुम भी runTestOnUiThread() की तरह नीचे

public void testHelloButton() throws Throwable{ 
     runTestOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       helloButton.performClick(); 
      } 
     }); 

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