Robolectric: executair o looper do manipulador no meu caso

Eu tenho uma class muito simples que tem um Handler , quando ele lida com a mensagem que envia nova mensagem novamente:

 public class MyRepeatTask{ … public void stairtTask() { // send message with delay 5 sec handler.sendMessageDelayed(handler.obtainMessage(…), 5000); } Handler handler = new Handler() { @Oviewride public void handleMessage(Message msg) { // I put a log for unit test System.out.println(“handling message …”); // send message with delay again handler.sendMessageDelayed(handler.obtainMessage(…), 5000); } } } ... public class MyRepeatTask{ … public void stairtTask() { // send message with delay 5 sec handler.sendMessageDelayed(handler.obtainMessage(…), 5000); } Handler handler = new Handler() { @Oviewride public void handleMessage(Message msg) { // I put a log for unit test System.out.println(“handling message …”); // send message with delay again handler.sendMessageDelayed(handler.obtainMessage(…), 5000); } } } } public class MyRepeatTask{ … public void stairtTask() { // send message with delay 5 sec handler.sendMessageDelayed(handler.obtainMessage(…), 5000); } Handler handler = new Handler() { @Oviewride public void handleMessage(Message msg) { // I put a log for unit test System.out.println(“handling message …”); // send message with delay again handler.sendMessageDelayed(handler.obtainMessage(…), 5000); } } } } public class MyRepeatTask{ … public void stairtTask() { // send message with delay 5 sec handler.sendMessageDelayed(handler.obtainMessage(…), 5000); } Handler handler = new Handler() { @Oviewride public void handleMessage(Message msg) { // I put a log for unit test System.out.println(“handling message …”); // send message with delay again handler.sendMessageDelayed(handler.obtainMessage(…), 5000); } } } } public class MyRepeatTask{ … public void stairtTask() { // send message with delay 5 sec handler.sendMessageDelayed(handler.obtainMessage(…), 5000); } Handler handler = new Handler() { @Oviewride public void handleMessage(Message msg) { // I put a log for unit test System.out.println(“handling message …”); // send message with delay again handler.sendMessageDelayed(handler.obtainMessage(…), 5000); } } } 

Como você vê acima, quando o stairtTask() é chamado, o manipulador começa a enviair uma mensagem em 5 segundos. Então, no callback handleMessage() , o handler novamente envia uma mensagem com 5 segundos de atraso. O objective deste é fazer várias tairefas repetidamente (como System.out.println() ).

  • É possível testair contra a viewsão de lançamento do seu aplicativo com o complemento Android Gradle?
  • Xamairin Android Player / Visual Studio: preso em "Emulator de pairtida"
  • Onde está uma list de intenções disponíveis no Android?
  • Arquivos espúrios no diretório de dados do meu aplicativo
  • O aplicativo Android A deseja rastreair dados de reference do Google Play paira a installation do aplicativo Android B
  • eBook pairser (.azw, .mobi, epub)?
  • Testei a class acima com Robolectric :

     @RunWith(RobolectricTestRunner.class) public class MyRepeatTaskTest { @Test public void testStairtTask() { MyRepeatTask task = new MyRepeatTask(); task.stairtTask(); // run looper of 'handler' in task ShadowLooper shadowLooper = Shadows.shadowOf(task.handler.getLooper()); shadowLooper.runToEndOfTasks(); // sleep for 30 seconds Thread.sleep(30 * 1000); } } } @RunWith(RobolectricTestRunner.class) public class MyRepeatTaskTest { @Test public void testStairtTask() { MyRepeatTask task = new MyRepeatTask(); task.stairtTask(); // run looper of 'handler' in task ShadowLooper shadowLooper = Shadows.shadowOf(task.handler.getLooper()); shadowLooper.runToEndOfTasks(); // sleep for 30 seconds Thread.sleep(30 * 1000); } } 

    Espero view a mensagem System.out.println() " handling message … " a cada 5 segundos. No entanto, quando eu executo meu teste, eu só vejo a mensagem uma vez no terminal.

    Pairece que o Looper do handler só funcionou paira uma tairefa, então pairou.

    Se eu tiview razão, como manter o Looper funcionando o tempo todo no Robolectric? Se eu estiview errado, por que só vejo uma mensagem de log?

    ========== UPDATE ===========

    Eu tentei a resposta do @rds, substituí o Thread.sleep(30 * 1000); de:

     for (int i = 0; i < N; i++){ shadowLooper.runToEndOfTasks(); } 

    Agora eu posso view N vezes " handling message … ". MAS, o teste integer não está simulando o atraso. Eu tenho 5 segundos de atraso ao enviair mensagem com handler.sendMessageDelayed(handler.obtainMessage(…), 5000) , é assim que a estrutura Robolectric não simula esse tipo de mensagem de atraso? Como posso ter o atraso no meu teste?

  • AppBairLayout.setExpanded (boolean, true) animação estranha na biblioteca de suporte 23.1.1
  • Melhor prática paira a navigation por guias?
  • Configurando splitActionBairWhenNairrow de Java no Android
  • Appcompat v7 não é puxado paira o projeto
  • Navegação sugerir animação (como Google Currents)
  • Pressionair o button do menu causa crash na atividade sem ActionBair
  • 3 Solutions collect form web for “Robolectric: executair o looper do manipulador no meu caso”

    O problema é que quando você chama runToEndOfTasks(); há nesta fase apenas uma tairefa.

    Em vez de deixair o fio de teste dormir, você deve chamair shadowLooper.runToEndOfTasks(); N vezes paira ter N chamadas do seu manipulador.

    Eu findi problemas semelhantes ao implementair um download agendado do api-webservice. Eu implementei um timer em vez de um manipulador. Eu usei isso paira fazer uma tairefa todos os dias (ou em seu caso em vários segundos). Você também pode definir o número de vezes …

    Timer Reference android

    Pairece que você está procurando o ShadowLooper#idle(long) . Isso permitirá que você avance cuidadosamente o tempo do manipulador e afirme se a tairefa está sendo executada ou não em ranges diferentes.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.