Android Testing Handler.postDelayed

Я новичок на Android и зацикливаюсь на тестировании SplashScreen, в основном то, что я делаю, пытается проверить, что экран заставки остается на 3 секунды. Это код для splashScreen

@Override protected void onStart() { super.onStart(); new Handler().postDelayed(new Runnable() { @Override public void run() { Intent i = new Intent(SplashScreenActivity.this, MainActivity.class); startActivity(i); finish(); } }, SPLASH_TIME_OUT); } 

И это мой подход к тесту:

 @Test public void splashScreenTimerTest() throws InterruptedException { StopWatch timer = new StopWatch(); timer.start(); splashScreenActivityController.start(); timer.stop(); long expected = 3000L; assertThat(String.format("The spalash screen run for longer than expected. It should stay on for [%d] but it run for [%d]",expected,timer.getTime()),timer.getTime(),equalTo(expected)); } 

Я использую Android + Robolectric для тестирования.

Я пару дней пробовал в Интернете, я пробовал много вещей, но никакого результата. Я пытаюсь получить поток пользовательского интерфейса и ждать его. Я попробовал вам планировщик, чтобы получить очередь и посмотреть, есть ли там какая-то задача. Но никакого результата.

Любое предложение, как я могу выполнить свой тест, подождать, пока не будет активирована новая активность?

благодаря

В Robolectric 3.0 они обновили этот API. Фактическая версия:

ShadowLooper.runUiThreadTasksIncludingDelayedTasks();

Пример использования:

 public class MainActivity extends AppCompatActivity { ........ public void finishGame() { Handler h = new Handler(); h.postDelayed(new Runnable() { @Override public void run() { finish(); } }, 5000); } } 

Протестируйте его:

 @RunWith(RobolectricTestRunner.class) @Config(constants = BuildConfig.class, sdk=21) public class MainActivityTest { @Test public void testFinishing() throws InterruptedException { MainActivity mainActivity = new MainActivity(); assertFalse(mainActivity.isFinishing()); mainActivity.finishGame(); ShadowLooper.runUiThreadTasksIncludingDelayedTasks(); assertTrue(mainActivity.isFinishing()); } } 

Можешь попробовать:

 Robolectric.pauseMainLooper(); Robolectric.getUiThreadScheduler().advanceBy(intervalMs); Robolectric.unPauseMainLooper(); 

Или, если вы только что были вызваны:

 Robolectric.runUiThreadTasksIncludingDelayedTasks(); 

В Robolectric 3.0 ответ IuriiO будет переведен на

 ShadowLooper.pauseMainLooper(); Robolectric.getForegroundThreadScheduler().advanceBy(intervalMs); ShadowLooper.unPauseMainLooper();