2012-11-07 5 views
5

私はAndroidアプリ用のJUnitテストケースを作成しています。テストクラスはActivityInstrumentationTestCase2を拡張し、TextEditウィジェットのユーザー入力をエミュレートするためにsendKeys()を呼び出します。ただし、すべての英字キーコード(KeyEvent.KEYCODE_G)は、小文字をTextEditに送信するだけです。私はKeyEvent.KEYCODE_SHIFT_LEFTアルファベットキーコードを送信する前に送信しようとしましたが、それは動作していないようでした。だから、どのように私は大文字を入力してユーザーをシミュレートするのですか?計測されたテスト中にTextEditに大文字を送信する

編集:

私は手動で大文字を入力することができます。実際には、のEditTextが

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

として定義されてandroid:capitalize="words"属性は、エミュレータで大文字モードに画面上のキーボードを強制します。 (私はそれがデバイス上で同じことをするだろうと仮定しますが、それをテストするものはありません)SDKに付属のエミュレータはハードウェアキーボードをエミュレートしないので、UIの使い方をテストできませんでしたハードキー。

また、私はこれをしなかったとき

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

はしかし、テストが失敗してみました。私はそのコードを全て指揮していたので、今ここで詳細はわかりません。私はそれを作り直して、その質問をこのような詳細で編集しようとします。

+0

sendKeys( "A")のように送信してみましたか。 KeyEvent.KEYCODE_Aの代わりに) –

+0

@DurairajPはい、 'sendKeys(" A ")'は 'sendKeys(KeyEvent.KEYCODE_A)'に相当します。 [ドキュメントによる 'sendKeys(String)'](http://developer.android.com/reference/android/test/InstrumentationTestCase.html#sendKeys(int ...)): "一連のキーは文字列ですKEYCODE_接頭辞なしでKeyEventで指定されたキー名を含んでいます。 " –

+0

@ Code-Guru:あなたの質問では、アルファベット順のコードの前に 'KeyEvent.KEYCODE_LEFT_SHIFT'を試してみました。私はそれが 'KeyEvent.KEYCODE_SHIFT_LEFT'でなければならないので、それがtypoであると仮定しています。 – Squonk

答えて

4

私は、私がテキストボックスにStringの文字を送信する方法を書いていたとは言いませんでした。 @PaulHarrisが提案したようにsetText()を使ってみましたが、動作させることができませんでした。私のテストはまだいくつかの主張に失敗しました。

最終的に私の目的のために働くInstrumentation.sendStringSync()が見つかりました。 (Instrumentationオブジェクトは、テストクラスでgetInstrumentation()を呼び出して取得できます)。

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); 
    } 
}); 

あなたはUIスレッド上のGUIとの対話を行う必要があるためです(またはあなたが好む任意の名前のメインスレッド)。

このような方法:

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-アンドロイド・ジュニット・クラスのテスト・テキスト・イン・テキスト入力 –

+0

また、 'Instrumentation.runOnMainSync()'、 'ActivityInstrumentationTestCase2.runTestOnUiThread()'、 'Activity.runOnUiThread()'の違いは何ですか? –

関連する問題