不同线程 IdlingResource 的 bug
  在进行 UI 测试的时候,有两个主线程需要区分一下,一个是主 App 运行的主线程([main,5,main]),另一个是 UI 测试跑的主线程([Instr: android.support.test.runner.AndroidJUnitRunner,5,main])。我们触发的UI事件都是在 App 主线程里面执行的,如果我们想要在 App 的线程里面做一些操作需要切换到对应的线程操作。如下面的代码:
mActivityTestRule.getActivity().runOnUiThread
(new Runnable() {
@Override
public void run() {
LogUtils.d(TAG, "runOnUiThread..." +
Thread.currentThread());
TaskApi.Companion.getMyTasks(0, 10000, "",
new HSAPICallback
<TaskListResult>() {
public void onRequestSuccess(TaskListResult data,
int httpStatus,
Boolean fromCache) {
super.onRequestSuccess(data, httpStatus, fromCache);
mTasks = data.getDatas();
}
});
}
});
  理论上这里进行的异步操作应该和 App 里面执行的异步操作是一样的,可以用 IdlingResource 去守护这样一个后台操作,但是实际使用下来,虽然 IdlingResource 已经接受到对应的异步完成回调,但是并没有回调到被注册的 ResourceCallback。
  hasProperty 异常
  Espresso 用的是 Hamcrest 的语法来进行的验证,理论上应该支持所有 Hamcrest 的写法,但是当我们在使用 hasProperty 这个方法的时候,会发现下面这样的错误。这主要是由于 Android SDK 里面并没有完整 JDK 的库,我们用到这部分刚好在 Android SDK 没有。
java.lang.NoClassDefFoundError:
Failed resolution of: Ljava/beans/Introspector;
at org.hamcrest.beans.PropertyUtil.propertyDescriptorsFor
(PropertyUtil.java:47)
at org.hamcrest.beans.PropertyUtil.getPropertyDescriptor
(PropertyUtil.java:28)
at org.hamcrest.beans.HasPropertyWithValue.propertyOn
(HasPropertyWithValue.java:94)
at org.hamcrest.beans.HasPropertyWithValue.matchesSafely
(HasPropertyWithValue.java:81)
at org.hamcrest.TypeSafeDiagnosingMatcher.matches(
TypeSafeDiagnosingMatcher.java:55)
at org.hamcrest.core.AllOf.matches(AllOf.java:27)
at org.hamcrest.DiagnosingMatcher.matches
(DiagnosingMatcher.java:12)
at android.support.test.espresso.action.
AdapterDataLoaderAction.
perform(AdapterDataLoaderAction.java:83)
at android.support.test.espresso.ViewInteraction$1.run
(ViewInteraction.java:144)
at java.util.concurrent.Executors$RunnableAdapter.
call(Executors.java:422)
at java.util.concurrent.FutureTask.
run(FutureTask.java:237)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
  根据 Android espresso onData error
  这篇文章可以找到对应的解决方案,但是实际使用下来效果并不好,主要是 gradle 的 Android 插件在不同的版本里面对于引入 Java Core 的代码处理方式有差别,而且我用的 2.2.3 的版本根本不能用,所以这里的建议绕过不要使用这个方法,我们后是通过自己定义了一个 Match 来解决这个问题的。