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

Synchronizing UI thread with dispatched View states dependant on worker thread events?

上面有一个Activity和一个按钮。任务是通过白盒测试 Activity 结果行为 "Button CLICK -> Button GONE -> Activity PAUSE -> Activity RESUME" 对按钮可见状态的影响。

天真的实现会导致 Activity 状态不一致,从而导致错误的测试输出:

// 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) 通过 AsyncTask 中的 onPostExecute() 同步触摸事件和随后的 Activity 生命周期事件调用会导致测试意外失败。

一般或专门为 Android 测试框架设计的 worker-ui 同步是否有规范或至少可行的解决方案?

必须使用 Instrumentation.class 中的 runOnMainSync() 通过 Android 测试框架工具同步 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.

中有介绍