单元测试处理程序

时间:2011-02-06 17:35:33

标签: android unit-testing

我最终试图对自定义基本适配器进行单元测试,但我陷入困境:我无法弄清楚如何让UI线程处理我刚刚通过{{1}传递给它的消息}。

在我的Activity中,我有一个“sendEmptyMessage(...)”方法更新数组然后调用“addFoo(Foo foo)”,我有一个sendEmptyMessage(1)方法调用ListView的适配器告诉它数据已经改变。

我将单元测试粗略地归结为:

handleMessage

当然,public void testAddFoo() { Foo foo = new Foo(); assertTrue(mActivity.addFoo(foo)); assertTrue(mActivity.getHandler().hasMessages(1)); assertFalse(mActivity.getHandler().hasMessages(1)); assertTrue(mActivity.fooListNotEmpty()); } 失败了(这是一个人为的例子,尽我所能简化它。)

我可以调用mActivity或其处理程序或looper来处理所有待处理的消息吗?我已经尝试了一些关于在UI线程中调用Looper.loop()的建议,但是这些建议在黑暗中被刺穿而且它们都失败了。

FWIW,我很确定handleMessage代码是正确的,因为如果我直接调用它(在assertFalse()内),就像这样:

@UiThreadTest

测试最终按预期工作。

2 个答案:

答案 0 :(得分:2)

如果您的Activity实现了Handler.Callback,并且您希望在handleMessage方法中显示消息,则需要在onCreate中初始化Handler时传入Activity。

mHandler = new Handler(this);

我知道你有成员Handler方法正常工作,但我正在为像我这样的人添加这个,试图找出如何使Handler.Callback接口方法正常工作。

答案 1 :(得分:1)

如果您在活动中实施Handler.Callback,那么您应该执行

assertTrue(mActivity.hasMessages(1));

否则不实现回调并使用

mHandler = new Handler() {

// override Handler methods as required
// ie handleMessage(Message msg)

};

assertTrue(mActivity.mHandler.hasMessages(1));