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

在Android视图中使用UI元素进行测试,android,junit,android-edittext,Android,Junit,Android Edittext,我正在尝试使用以下测试用例测试简单UI, 主要思想是在测试中设置一些UI文本(模拟用户输入),然后主动单击事件 public class StackTestCase extends ActivityInstrumentationTestCase2<Stack> { private StackDemo mActivity; private EditText eaten; public StuckTestCase() { super("com.crocod

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

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

}

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

这是一个老生常谈的问题,但我还是会给你一个答案,以防有人无意中发现

除了主线程(UI线程),您不允许在任何地方更改UI小部件的状态。您的performClick必须按以下方式完成:

mActivity.runOnUiThread(new Runnable() {
  @Override
  public void run() {
    mCount.performClick();
  }
});
但这还不是全部,您还需要通过添加以下行将检测测试与ui同步:

getInstrumentation().waitForIdleSync();

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

问题在于,您只能从UI线程中触摸/更改视图。您可以使用runnable as Rober概述或注释

您可以使用以下命令在UI线程上运行测试内部的所有方法:

更新:

此@接口在API级别24中被弃用
改用。新的测试应该使用


我面临的问题是,'waitForIdleSync();'调用本身挂起在无限循环中。调试该问题时,发现通过处理程序发布的“emptyRunnable()”消息未被“MessageQueue”捕获。似乎存在一些时间问题。但不确定如何定位问题。
getInstrumentation().waitForIdleSync();
@UiThreadTest
public void testSimpleDefaults(){
     double status = Double.valueOf(mStatus.getText().toString());
     eaten.setText(2);
     mCount.performClick();
     assertEquals((status-2),Double.valueOf(mStatus.getText().toString()));
}