I am ultimately trying to unit test a custom base adapter, but I am stuck at one point: I am unable to figure out how to get the UI thread to process the message I have just passed to it via sendEmptyMessage(...).
In my Activity I have a “addFoo(Foo foo)” method that updates an array and then calls “sendEmptyMessage(1)“, and I have a handleMessage method that calls the ListView’s adapter to tell it the data has changed.
I’ve boiled the unit test down to, roughly:
public void testAddFoo() {
Foo foo = new Foo();
assertTrue(mActivity.addFoo(foo));
assertTrue(mActivity.getHandler().hasMessages(1));
assertFalse(mActivity.getHandler().hasMessages(1));
assertTrue(mActivity.fooListNotEmpty());
}
Naturally it is failing on that assertFalse() (this is a contrived example, simplifying it as best as I can).
What call can I make in to mActivity or its handler or looper to get it to process all pending messages? I have tried some suggestions I’ve read about calling Looper.loop(), within the UI thread, but those are stabs in the dark and they failed.
FWIW, I’m pretty sure that the handleMessage code is correct because if I call it directly (inside @UiThreadTest) like so:
@UiThreadTest
public void testAddFoo() {
Foo foo = new Foo();
assertTrue(mActivity.addFoo(foo));
Message msg = Message.obtain();
msg.what = 1;
mActivity.handleMessage(msg);
assertTrue(mActivity.fooListNotEmpty());
}
the test ends up working as expected.
If you are implementing
Handler.Callbackin your activity then you should just dootherwise do not implement the callback and use
and