2011-02-06 2 views
1

В конечном итоге я пытаюсь выполнить тестирование тестового адаптера базы данных, но я застрял в одном месте: я не могу понять, как заставить поток пользовательского интерфейса обрабатывать сообщение, которое я только что передал ему, через sendEmptyMessage(...) ,Обработчик единиц измерения

В моей деятельности у меня есть «addFoo(Foo foo)» метод, который обновляет массив, а затем называет «sendEmptyMessage(1)», и у меня есть handleMessage метод, который вызывает адаптер в ListView, чтобы сказать ему, данные изменились.

Я вареный тест блока вниз, грубо:

public void testAddFoo() { 
    Foo foo = new Foo(); 
    assertTrue(mActivity.addFoo(foo)); 
    assertTrue(mActivity.getHandler().hasMessages(1)); 
    assertFalse(mActivity.getHandler().hasMessages(1)); 
    assertTrue(mActivity.fooListNotEmpty()); 
} 

Естественно, не удается на этом assertFalse() (это надуманный пример, упрощая его как лучше, как я могу).

Какой вызов я могу подключить к mActivity или его обработчику или петлителю, чтобы заставить его обрабатывать все ожидающие сообщения сообщения? Я пробовал некоторые предложения, которые я читал о вызове Looper.loop(), в потоке пользовательского интерфейса, но это теги в темноте, и они потерпели неудачу.

FWIW, я уверен, что код handleMessage правильно, потому что если я буду называть его непосредственно (внутри @UiThreadTest) как так:

@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()); 
} 

тест заканчивает работать, как ожидалось.

+0

можете ли вы разместить свой код, который устанавливает обработчик? – techiServices

+0

@sugarynygs: обработчик настроен с помощью «mHandler = new Handler();» внутри действия, объявленного как «public class FooActivity extends Activity, реализует Handler.Callback». mHandler предоставляется JUnit через «public Handler getHandler() {return mHandler;}» –

+0

Я правильно говорю, что вы явно создаете новый «Обработчик», а также реализуете «Handler.Callback»? – techiServices

ответ

1

Если вы реализуете Handler.Callback в вашей деятельности, то вы должны просто сделать

assertTrue(mActivity.hasMessages(1)); 

иначе не выполняют функцию обратного вызова и использовать

mHandler = new Handler() { 

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

}; 

и

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

Вы правы, я могу легко проверить отправку сообщений, если перейду от использования интерфейса обратного вызова к обработчику элемента. Я не уверен, что Voodoo происходит под капотом, что позволяет отправлять сообщения на самом деле, но я думаю, на данный момент я просто должен согласиться с тем, что «это происходит». Благодарю. –

+0

Ваше приветствие. Из интереса выступает assertTrue (mActivity.hasMessages (1)); не работает, когда вы реализуете Handler.Callback? – techiServices

2

Если активность реализует Handler.Callback, и вы хотите, чтобы сообщения отображались в вашем h andleMessage, тогда вам нужно передать свою активность, когда вы инициализируете обработчик в onCreate.

mHandler = new Handler(this); 

Я знаю, что вы получили член Handler подход работает, но я добавляю это для людей вроде меня, которые появляются здесь, пытаясь выяснить, как получить подход Handler.Callback интерфейс работает.

Смежные вопросы