关于Instrumentation 测试如何测试OnFling()方法

wangxiaoqi331 2011-05-11 09:15:42

我现在写了一个测试类继承了ActivityInstrumentationTestCase2, 我只能利用sendKeys()方法模拟手机键的输入模拟UI的按键的事件。可我希望能测试用户在屏幕上滑动组件的效果,如何模拟呢?是使用Instrumentation.sendPointerSync()这个方法来实现吗?

我的测试方法如下:

MonthModel currentMonth = activity.getCurrentMonth();
final Instrumentation instrumentation = this.getInstrumentation();
assertNotNull(instrumentation);
long firstTime = SystemClock.uptimeMillis();
final MotionEvent firstEvent = MotionEvent.obtain(firstTime, firstTime,
MotionEvent.ACTION_DOWN, 100, 170, 0);
long secondTime = SystemClock.uptimeMillis();

final MotionEvent secondEvent = MotionEvent.obtain(secondTime,
secondTime, MotionEvent.ACTION_UP, 100, 340, 0);
activity.runOnUiThread(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
instrumentation.sendPointerSync(firstEvent);
instrumentation.sendPointerSync(secondEvent);
}

});

currentMonth = currentMonth.gotoPreviousMonth();
assertEquals(currentMonth, activity.getCurrentMonth());

不考虑业务逻辑,当我执行这个方法的时候,会产生如下的异常:


android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRoot.checkThread(ViewRoot.java:2802)
at android.view.ViewRoot.requestLayout(ViewRoot.java:594)
at android.view.View.requestLayout(View.java:8125)
at android.view.View.setLayoutParams(View.java:4860)
at android.view.WindowManagerImpl.updateViewLayout(WindowManagerImpl.java:188)
at android.view.Window$LocalWindowManager.updateViewLayout(Window.java:428)
at android.app.Activity.onWindowAttributesChanged(Activity.java:1974)
at android.view.Window.setFlags(Window.java:638)
at android.view.Window.addFlags(Window.java:603)
at com.cybercom.canlendarApp.test.activity.CalendarAppTest.setUp(CalendarAppTest.java:37)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:520)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1447)
希望有高手能为我解答疑惑,谢谢哈。
...全文
349 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiushimao828 2012-04-08
  • 打赏
  • 举报
回复
谢谢lz,学习了……
wyx100 2011-05-11
  • 打赏
  • 举报
回复
如何解决的?
wangxiaoqi331 2011-05-11
  • 打赏
  • 举报
回复
现在这个问题解决了,没有异常出现了,可问题是onFling()方法没有触发。。。。希望有高手能告诉我如何模拟事件触发onFling()方法,谢谢了
wangxiaoqi331 2011-05-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dinjay 的回复:]

???你不是说测试OnFling()么?你就发了一个ACTION_DOWN和ACTION_UP,没move啊,没move怎么触发onfling啊
[/Quote]

谢谢回复,这也是我其中一个疑问哈,我不清楚怎么去模拟这个引起onFling的事件,以及如何把它和拖动事件区别开来?

我现在加了一个Move的事件,但是仍然产生上面的那个异常,可见,问题关键跟线程有关,我查了一下,可能是与某些应该在主线程上执行的逻辑在其他线程上执行产生了这个异常,可我不清楚我的代码上哪方面出了这个问题?
dinjay 2011-05-11
  • 打赏
  • 举报
回复
???你不是说测试OnFling()么?你就发了一个ACTION_DOWN和ACTION_UP,没move啊,没move怎么触发onfling啊
wangxiaoqi331 2011-05-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wyx100 的回复:]

如何解决的?
[/Quote]
出现这个问题的原因是我在测试类的setup() 方法中有这样的代码:

activity.getWindow().addFlags(
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
我把它注释了之后在执行测试,就没有异常抛出了,可问题是onFling()方法仍然没有触发, 如何解决呢?

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧