2012-11-07 27 views
5

मैं अपने एंड्रॉइड ऐप के लिए एक जुनीट टेस्ट केस लिख रहा हूं। टेस्ट क्लास ActivityInstrumentationTestCase2 बढ़ाता है और पर TextEdit विजेट्स के लिए उपयोगकर्ता इनपुट अनुकरण करने के लिए कॉल करता है। हालांकि, सभी वर्णमाला कुंजीकोड (उदा। KeyEvent.KEYCODE_G) केवल TextEdit पर निचले केस अक्षर भेजें। मैंने वर्णमाला कुंजीकोड भेजने से पहले KeyEvent.KEYCODE_SHIFT_LEFT भेजने का प्रयास किया, लेकिन ऐसा लगता है कि यह काम नहीं कर रहा था। तो मैं उपयोगकर्ता को ऊपरी-केस अक्षर टाइप करने का अनुकरण कैसे करूं?वाद्ययंत्र परीक्षण के दौरान टेक्स्टएडिट पर ऊपरी केस अक्षरों को भेजना

संपादित करें:

मैं अपर केस पत्र मैन्युअल रूप से दर्ज कर सकते हैं। वास्तव में, EditText के रूप में

<EditText android:id="@id/brand_text" 
       android:singleLine="true" 
       android:capitalize="words" 
       android:hint="@string/brand_hint" 
    /> 

android:capitalize="words" विशेषता एमुलेटर में अपरकेस मोड में ऑनस्क्रीन कीबोर्ड बलों परिभाषित किया गया है। (मुझे लगता है कि यह एक डिवाइस पर भी ऐसा ही करेगा लेकिन इसका परीक्षण करने के लिए कोई नहीं है।) चूंकि एसडीके के साथ आने वाला एमुलेटर हार्डवेयर कीबोर्ड का अनुकरण नहीं करता है, इसलिए मैं यह जांचने में असमर्थ हूं कि मेरा यूआई कैसे काम करता है हार्ड कुंजी

मैं भी कोशिश की

EditText brandText = this.activity.findViewById(R.id.brand_text); 
brandText.setText(someString); 

हालांकि, परीक्षण विफल जब मैं ऐसा किया। मैंने उस कोड को कुल्हाड़ी दी, इसलिए मेरे पास इस समय विवरण नहीं है। मैं इसे फिर से बनाने और उन विवरणों के साथ इस प्रश्न को संपादित करने की कोशिश करूंगा।

+0

क्या आपने sendKeys ("A") भेजने की कोशिश की है; KeyEvent.KEYCODE_A के बजाय) –

+0

@DurairajP हां, 'sendKeys (" ए ")' 'sendKeys (KeyEvent.KEYCODE_A)' के बराबर है। [दस्तावेज़ों के अनुसार 'sendKeys (स्ट्रिंग) '] (http://developer.android.com/reference/android/test/InstrumentationTestCase.html#sendKeys (int ...)):" कुंजी का अनुक्रम एक स्ट्रिंग है KEYCODE_ उपसर्ग के बिना, KeyEvent में निर्दिष्ट कुंजी नाम शामिल हैं। " –

+0

@ कोड-गुरु: आपके प्रश्न में आप कहते हैं कि आपने वर्णमाला कोड से पहले 'KeyEvent.KEYCODE_LEFT_SHIFT' को आजमाया है। मुझे लगता है कि यह एक टाइपो है क्योंकि यह 'KeyEvent.KEYCODE_SHIFT_LEFT' होना चाहिए। – Squonk

उत्तर

4

मैंने अपने ओपी में उल्लेख नहीं किया कि मैं String के अक्षरों को एक टेक्स्ट बॉक्स में भेजने के लिए एक विधि लिख रहा था। मैंने setText() का उपयोग करने की कोशिश की क्योंकि @ पॉलहारीस ने सुझाव दिया लेकिन इसे काम नहीं कर सका; मेरे परीक्षण अभी भी कुछ दावों में विफल रहे।

कुछ खोदने के बाद, अंततः Instrumentation.sendStringSync() पाया जो मेरे उद्देश्यों के लिए काम करता है। (आप अपने टेस्ट क्लास में getInstrumentation() पर कॉल करके Instrumentation ऑब्जेक्ट प्राप्त कर सकते हैं।)

1

आप की तरह कुछ करने के लिए करना चाहते हैं:

EditText brandText = this.activity.findViewById(R.id.brand_text); 
brandText.setText(someString); 

क्या आप वास्तव में क्या करने की जरूरत है:

EditText brandText = this.activity.findViewById(R.id.brand_text); 
instrumentation.runOnMainSync(new Runnable() { 
    @Override 
    public void run() { 
     brandText.setText(someString); 
    } 
}); 

इसका कारण यह है कि आप यूआई थ्रेड पर जीयूआई के साथ किसी भी बातचीत करने की ज़रूरत है (या मुख्य धागा जो भी नाम आप पसंद करते हैं)।

एक इस जैसे विधि:

public void setText(EditText editText, final String textToSet){ 
    instrumentation.runOnMainSync(new Runnable() { 
     @Override 
     public void run() { 
      brandText.setText(textToSet); 
     } 
    }); 
} 

आप के लिए ठीक काम करना चाहिए।

+0

यदि आपके पास कोई पल है, तो क्या आप http://stackoverflow.com/questions/13169235/preferred- पर मेरा संबंधित प्रश्न देख सकते हैं। जिस तरह से करने के लिए परीक्षण edittext-इनपुट-इन-एक-android-JUnit स्तरीय? –

+0

इसके अलावा, 'Instrumentation.runOnMainSync() ',' ActivityInstrumentationTestCase2.runTestOnUiThread() ', और' Activity.runOnUiThread() '(' पहले सिंक्रनाइज़ेशन के अलावा) के बीच अंतर क्या हैं? –