我最终试图对自定义基本适配器进行单元测试,但我陷入困境:我无法弄清楚如何让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
测试最终按预期工作。
答案 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));