将UI线程与调度的视图状态同步依赖于工作线程事件?

时间:2015-09-17 14:43:01

标签: java android multithreading android-testing ui-thread

上面有一个活动和一个按钮。任务是通过白盒测试以获得活动后果行为的影响"按钮CLICK - >按钮GONE - >活动暂停 - >活动简历"按钮可见性状态。

朴素的实现会导致活动状态不一致,从而导致错误的测试输出:

// worker thread
TouchUtils.clickView(this, mButton);
...
// ui thread
instrumentation.callActivityOnStop(mActivity);
instrumentation.callActivityOnResume(mActivity);
assertTrue(View.GONE == mButton.getVisibility());

两个glympse方法没有成功:

1)在TouchUtils.clickView()执行后为主线程添加睡眠但是并没有完全解决问题,但会对经验UI超时持续时间产生额外的依赖。

2)通过{strong> AsyncTask 中的onPostExecute()同步触摸事件和后续活动生命周期事件会导致测试无法预测地失败。

是否存在任何规范或至少可行的解决方案,一般用于工人ui同步或专为Android Test框架设计?

1 个答案:

答案 0 :(得分:0)

必须使用 Instrumentation.class 中的runOnMainSync()来通过Android Test Framework工具同步UI和工作线程事件:

// worker thread
TouchUtils.clickView(this, mButton);
instrumentation.runOnMainSync(new Runnable() {
    @Override
    public void run() {
        instrumentation.callActivityOnStop(mActivity);
        instrumentation.callActivityOnResume(mActivity);
        assertTrue(View.GONE == mButton.getVisibility());
    }
});

但是,如果有任何其他建议或一般(不是与Android测试框架相关)指南的答案,则表示赞赏。

注意:官方best practices for testing中介绍了与主要线程同步的更多特殊工具。