5

我正在为我的 Android 应用程序编写一个 JUnit 测试用例。测试类扩展ActivityInstrumentationTestCase2并调用以模拟小部件sendKeys()的用户输入。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"属性在模拟器中强制屏幕键盘进入大写模式。(我假设它会在设备上做同样的事情,但没有一个可以测试它。)由于 SDK 附带的模拟器不模拟硬件键盘,我无法测试我的 UI 是如何工作的硬键。

我也试过

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

但是,当我这样做时,测试失败了。我删掉了所有的代码,所以我现在没有详细信息。我将尝试重新创建它并使用这些详细信息编辑此问题。

4

2 回答 2

4

我没有在我的 OP 中提到我正在编写一种将 a 的字符发送String到文本框的方法。我尝试setText()按照@PaulHarris 的建议使用,但无法正常工作;我的测试仍然没有通过一些断言。

经过一番挖掘,终于找到Instrumentation.sendStringSync()了适合我的目的。(您可以通过在测试类中Instrumentation调用getInstrumentation()来获取对象。)

于 2012-11-20T03:18:26.263 回答
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);
        }
    }); 
}

应该适合你。

于 2012-11-09T21:58:07.493 回答