2012-11-07 7 views
5

Piszę test JUnit dla mojej aplikacji na Androida. Klasa testowa obejmuje ActivityInstrumentationTestCase2 i wywołuje sendKeys(), aby emulować dane wejściowe użytkownika dla widgetów TextEdit. Jednak wszystkie kody alfabetyczne (na przykład KeyEvent.KEYCODE_G) wysyłają tylko małe litery do TextEdit. Próbowałem wysłać KeyEvent.KEYCODE_SHIFT_LEFT przed wysłaniem kodu alfabetycznego, ale to nie działało. Jak więc zasymulować wpisanie wielkiej litery przez użytkownika?Wysyłanie dużych liter do TextEdit podczas testowanych testów

Edit:

mogę ręcznie wprowadzić wielkimi literami. W rzeczywistości, EditText jest zdefiniowany jako

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

Atrybut android:capitalize="words" zmusza klawiaturę ekranową w tryb wielkich liter w emulatorze. (Zakładam, że zrobi to samo na urządzeniu, ale nie ma go do przetestowania.) Ponieważ emulator, który jest dostarczany z SDK, nie emuluje klawiatury sprzętowej, nie byłem w stanie przetestować działania mojego interfejsu twarde klucze.

Próbowałem też

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

Jednak test zakończył się niepowodzeniem, kiedy to zrobił. Osiągnąłem ten kod, więc nie mam tutaj w tej chwili żadnych szczegółów. Spróbuję odtworzyć to i edytować to pytanie z tymi szczegółami.

+0

Czy próbowałeś wysyłać jak sendKeys ("A"); zamiast KeyEvent.KEYCODE_A) –

+0

@DurairajP Tak, 'sendKeys (" A ")' jest równoważne 'sendKeys (KeyEvent.KEYCODE_A)'. [Zgodnie z dokumentami 'sendKeys (String)'] (http://developer.android.com/reference/android/test/InstrumentationTestCase.html#sendKeys (int ...)): "Sekwencja klawiszy jest ciągiem znaków zawierające nazwy kluczy określone w KeyEvent, bez prefiksu KEYCODE_. " –

+0

@ Code-Guru: W swoim pytaniu mówisz, że wypróbowałeś 'KeyEvent.KEYCODE_LEFT_SHIFT' przed kodem alfabetycznym. Zakładam, że to literówka, jak powinno być 'KeyEvent.KEYCODE_SHIFT_LEFT'. – Squonk

Odpowiedz

4

Nie wspomniałem w moim OP, że pisałem metodę wysyłania znaków z String do pola tekstowego. Próbowałem użyć setText() jako sugestii @PaulHarris, ale nie mogłem go uruchomić; moje testy wciąż zawodziły niektóre twierdzenia.

Po pewnym kopaniu, w końcu znalazłem Instrumentation.sendStringSync(), który działa dla moich celów. (Możesz uzyskać obiekt Instrumentation, wywołując getInstrumentation() w swojej klasie testowej.)

1

Jeśli chcesz zrobić coś takiego:

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

Co rzeczywiście trzeba zrobić, to:

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

To dlatego, że trzeba robić żadnych interakcji z GUI na UI wątek (lub główny wątek, dowolne imię, które wolisz).

Sposób taki jak ten:

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

powinien pracować dla ciebie dobrze.

+0

Jeśli masz chwilę, możesz sprawdzić moje pokrewne pytanie na http://stackoverflow.com/questions/13169235/preferred- droga do testowania-edytekstekstu-wprowadzania-w-android-junit-klasy? –

+0

Ponadto, jakie są różnice między 'Instrumentation.runOnMainSync()', 'ActivityInstrumentationTestCase2.runTestOnUiThread()' i 'Activity.runOnUiThread()' (inne niż pierwsze działa synchronicznie)? –

Powiązane problemy