2012-11-07 2 views
5

Sto scrivendo un test case JUnit per la mia app per Android. La classe di test estende ActivityInstrumentationTestCase2 e chiama sendKeys() per emulare l'input dell'utente per i widget TextEdit. Tuttavia, tutti i codici chiave alfabetici (ad esempio KeyEvent.KEYCODE_G) inviano solo lettere minuscole allo TextEdit. Ho provato a inviare KeyEvent.KEYCODE_SHIFT_LEFT prima di inviare un codice alfabetico, ma non sembra funzionare. Quindi, come faccio a simulare l'utente digitando una lettera maiuscola?Invio di lettere maiuscole a un TextEdit durante i test strumentali

Edit:

posso entrare lettere maiuscole manualmente. Infatti, l'EditText è definito come

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

L'attributo android:capitalize="words" costringe la tastiera virtuale in modalità maiuscolo nell'emulatore. (Suppongo che farà lo stesso su un dispositivo ma non ne ho uno per testarlo.) Poiché l'emulatore fornito con l'SDK non emula la tastiera hardware, non sono stato in grado di testare come funziona la mia UI chiavi dure.

Ho anche provato

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

Tuttavia, il test non è riuscito quando ho fatto questo. Ho preso tutto il codice, quindi non ho i dettagli qui al momento. Proverò a ricrearlo e a modificare questa domanda con quei dettagli.

+0

Hai provato a inviare come sendKeys ("A"); invece di KeyEvent.KEYCODE_A) –

+0

@DurairajP Sì, 'sendKeys (" A ")' è equivalente a 'sendKeys (KeyEvent.KEYCODE_A)'. [Secondo i documenti 'sendKeys (String)'] (http://developer.android.com/reference/android/test/InstrumentationTestCase.html#sendKeys (int ...)): "La sequenza di chiavi è una stringa contenente i nomi delle chiavi come specificato in KeyEvent, senza il prefisso KEYCODE_. " –

+0

@ Code-Guru: nella tua domanda dici di aver provato "KeyEvent.KEYCODE_LEFT_SHIFT" prima del codice alfabetico. Suppongo che sia un errore di battitura come dovrebbe essere 'KeyEvent.KEYCODE_SHIFT_LEFT'. – Squonk

risposta

4

Non ho menzionato nel mio OP che stavo scrivendo un metodo per inviare i caratteri di un String in una casella di testo. Ho provato a utilizzare setText() come suggerito da @PaulHarris ma non ho potuto farlo funzionare; i miei test fallivano ancora alcune affermazioni.

Dopo alcuni scavi, ho finalmente trovato Instrumentation.sendStringSync() che funziona per i miei scopi. (Puoi ottenere un oggetto Instrumentation chiamando lo getInstrumentation() nella tua classe di test.)

1

Se si vuole fare qualcosa di simile:

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

cosa hai veramente bisogno di fare è:

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

Questo perché è necessario fare alcuna interazione con l'interfaccia grafica sul thread UI (o filo principale qualunque sia il nome che preferisci).

Un metodo come questo:

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

dovrebbe funzionare per voi bene.

+0

Se/quando hai un momento, puoi controllare la mia domanda relativa a http://stackoverflow.com/questions/13169235/preferred- way-to-test-EditText-input-in-an-android-JUnit-classe? –

+0

Inoltre, quali sono le differenze tra 'Instrumentation.runOnMainSync()', 'ActivityInstrumentationTestCase2.runTestOnUiThread()' e 'Activity.runOnUiThread()' (diverso dal primo che viene eseguito in modo sincrono)? –