2012-01-13 44 views
7

有没有人能够使用TouchUtils类提供的方法在Android模拟器上成功执行单元测试?
我能够让测试通过我的设备,但是当我在模拟器上运行完全相同的测试(和测试套件)时,任何使用TouchUtils方法的测试都会引发以下异常:TouchUtils with Android Emulator

java.lang.SecurityException: Injecting to another application requires INJECT_EVENTS permission 
at android.os.Parcel.readException(Parcel.java:1327) 
at android.os.Parcel.readException(Parcel.java:1281) 
at android.view.IWindowManager$Stub$Proxy.injectPointerEvent(IWindowManager.java:1196) 
at android.app.Instrumentation.sendPointerSync(Instrumentation.java:902) 
at android.test.TouchUtils.drag(TouchUtils.java:786) 
at android.test.TouchUtils.dragViewTo(TouchUtils.java:633) 
... 

我解锁了keyguard,甚至运行了其他(非TouchUtils)已通过的测试用例。
我没有应用@UiThreadTest,我是否还需要运行任何需要在UI线程上运行的代码。
当我注释掉使用TouchUtils.dragViewTo(...)的行并放入简单的assert(true)时,测试运行并通过。

任何想法?

+1

您是否找到答案?我也遇到了这个麻烦,并且没有太多可以找到的问题。 – Egor 2012-09-20 07:47:08

回答

2

如果您的手机被锁定或HomeScreen上有其他活动,就会发生这种情况。

+0

它适用于我的手机,它不适用于模拟器。 我已经从屏幕上删除了锁,因为我可以看到仿真器上正在运行的其他测试。 – 2012-01-14 16:03:32

0

模拟器非常慢,当您在关闭虚拟键盘后模拟UI交互时,没有足够的时间让虚拟键盘解散,因此实际上将事件注入虚拟键盘而不是您的应用。

在隐藏软键盘之后尝试进行任何UI交互之前,只需在您的线程上睡大约500-1000ms即可。

try { 
    Thread.sleep(500); 
} 
catch (InterruptedException e) { 
    e.printStackTrace(); 
}