2012-11-07 13 views
5

Android uygulamam için bir JUnit test durumu yazıyorum. Test sınıfı ActivityInstrumentationTestCase2'u uzatır vewidget'ları için kullanıcı girdisini taklit etmek için sendKeys()'u çağırır. Ancak, tüm alfabetik anahtar kodları (ör. KeyEvent.KEYCODE_G) sadece küçük harfleri TextEdit'a gönderir. Alfabetik anahtar kod göndermeden önce KeyEvent.KEYCODE_SHIFT_LEFT göndermeyi denedim, ancak bu işe yaramadı. Peki, kullanıcı bir büyük harf yazarak nasıl simüle edebilirim?Enstrümantasyonlu testler sırasında bir TextEdit'e büyük harfler gönderme

Düzenleme:

elle harf harf girebilirsiniz. android:capitalize="words" nitelik emülatörü içinde büyük moduna ekran klavyesini zorlar

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

olarak Aslında, EditText tanımlanır. (Bir aygıtta aynı şeyi gerçekleştireceğini varsayalım, ancak bunu test edebilecek biri yok.) SDK ile birlikte gelen emülatör donanım klavyesine benzemediğinden, UI'mın nasıl çalıştığını test edemedim. sabit tuşlar.

Ben de bunu yaparken
EditText brandText = this.activity.findViewById(R.id.brand_text); 
brandText.setText(someString); 

Ancak testi başarısız çalıştı. Tüm bu kodu koydum, bu yüzden şu an burada detaylarım yok. Yeniden oluşturmayı ve bu soruyu bu detaylarla düzenlemeyi deneyeceğim. Eğer böyle bir şey yapmak istiyorsanız

+0

SendKeys ("A") gibi göndermeyi denediniz; yerine KeyEvent.KEYCODE_A) –

+0

@DurairajP Evet, 'sendKeys (" A ")', 'sendKeys (KeyEvent.KEYCODE_A)' ile eşdeğerdir. [Docs 'sendKeys (String)'] 'e göre (http://developer.android.com/reference/android/test/InstrumentationTestCase.html#sendKeys (int ...)): "Anahtar dizisi bir dizgidir KEYCODE_ öneki olmadan KeyEvent'te belirtilen anahtar adlarını içerir. " –

+0

@ Code-Guru: Sorunuzda, alfabetik koddan önce 'KeyEvent.KEYCODE_LEFT_SHIFT' denediğinizi söylüyorsunuz. Ben 'KeyEvent.KEYCODE_SHIFT_LEFT' olması gerektiği gibi bir yazım hatası varsayalım. – Squonk

cevap

4

OP'imde, bir metin kutusuna String karakterlerini göndermek için bir yöntem yazdığımdan bahsetmedim. @PaulHarris'in önerdiği gibi setText() kullanmayı denedim, ancak işe alamadım; Sınavlarım hala bazı iddialarda başarısız oldu.

Bazı kazma işlemlerinden sonra, neticede amaçlarınız için çalışan Instrumentation.sendStringSync() bulundu. (Test sınıfınızda getInstrumentation() numaralı telefonu arayarak Instrumentation nesnesini alabilirsiniz.)

1

:

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

Ne aslında yapmanız gereken şudur: UI iş parçacığı üzerinde gui ile herhangi bir etkileşim yapmak gerekir çünkü

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

budur (veya tercih ettiğiniz adın ana iş parçacığı). Bunun gibi

bir yöntem:

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

sadece iyi sizin için çalışması gerekir.

+0

Bir an varsa, ilgili soruma http://stackoverflow.com/questions/13169235/preferred- adresinden ulaşabilirsiniz. yön için test-EditText-giriş-in--robot-jUnit sınıfının? –

+0

Ayrıca, Instrumentation.runOnMainSync() ',' ActivityInstrumentationTestCase2.runTestOnUiThread() 've' Activity.runOnUiThread() 'arasındaki farklar nelerdir (ilki senkronize olarak çalışır)? –