首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Android视图中使用UI元素进行测试

在Android视图中使用UI元素进行测试
EN

Stack Overflow用户
提问于 2010-08-30 04:09:45
回答 2查看 8.3K关注 0票数 9

我尝试用下面的测试用例来测试简单的UI,主要的想法是在测试中设置一些UI文本(以模拟用户输入),然后主动单击一个事件。

代码语言:javascript
复制
public class StackTestCase 
extends ActivityInstrumentationTestCase2<Stack> 
{
private StackDemo mActivity;

private EditText eaten;
    public StuckTestCase() {
         super("com.crocodil.software.stack", Stack.class);


    }
    public StuckTestCase(Class<Stack> activityClass) {
         super("com.crocodil.software.stack", activityClass);

    }
    protected void setUp() throws Exception {
        super.setUp();
        mActivity = this.getActivity();
        mCount = (Button) mActivity.findViewById(com.crocodil.software.stack.R.id.action);
        eaten = (EditText) mActivity.findViewById(com.crocodil.software.stack.R.id.eaten);

    }

    public void testPreconditions() {
        assertNotNull(mStatus);
      }

    public void testSimpleDefaults(){
        double status = Double.valueOf(mStatus.getText().toString());
        eaten.setText(2);
        mCount.performClick();
        assertEquals((status-2),Double.valueOf(mStatus.getText().toString()));
    }

}

运行的结果是异常-

代码语言:javascript
复制
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRoot.checkThread(ViewRoot.java:2802)
at android.view.ViewRoot.playSoundEffect(ViewRoot.java:2581)
at android.view.View.playSoundEffect(View.java:8516)
at android.view.View.performClick(View.java:2407)
at com.crocodil.software.stack.test.StackTestCase.testSimpleDefaults(StackTestCase.java:46)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:204)
at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:194)
at android.test.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentationTestCase2.java:186)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:520)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1447)

每次访问UI元素时都会发生这种情况,而我无法通过使用句柄或异步任务来避免这种情况。有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-12 14:09:06

这是一个古老的问题,但我还是要给你一个答案,以防有人偶然发现它。

除了主线程(UI线程)之外,您不能从任何地方更改UI小工具的状态。您的performClick必须像这样完成:

代码语言:javascript
复制
mActivity.runOnUiThread(new Runnable() {
  @Override
  public void run() {
    mCount.performClick();
  }
});

但这还不是全部,您还需要通过添加以下行将您的工具测试与ui同步:

代码语言:javascript
复制
getInstrumentation().waitForIdleSync();

同步行通常紧跟在runOnUiThread()代码之后。

票数 30
EN

Stack Overflow用户

发布于 2013-07-16 07:13:59

问题是您只能从UI线程触摸/更改视图。您可以使用runnable as Rober outlined或annotation。

您可以使用@UiThreadTest annotation在UI线程上运行测试中的所有方法

更新:

此@接口在API level 24中已弃用。

请改用UiThreadTest。应该使用Android Testing Support Library编写新的测试。

代码语言:javascript
复制
@UiThreadTest
public void testSimpleDefaults(){
     double status = Double.valueOf(mStatus.getText().toString());
     eaten.setText(2);
     mCount.performClick();
     assertEquals((status-2),Double.valueOf(mStatus.getText().toString()));
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3596397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档