不同线程 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 来解决这个问题的。