Android Testing Handler.postDelayed

北慕城南 提交于 2019-12-12 07:14:55

问题


I'm newbie on Android and get stuck on testing a SplashScreen, basically what I'm doing is trying to test that the splash screen stays on for 3s. this is the code for the 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);
}

And this is my approach for the test:

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

I'm using Android+Robolectric for testing.

I've been googling for a couple days, I tried many things but no result at all. I try to get the UI Thread and wait for it. I tried to you scheduler to get the queue and see if there is any task there. But no result at all.

Any suggestion how can I make my test wait until the new Activity is triggered?

Thanks


回答1:


In Robolectric 3.0, they updated this API. The actual version:

ShadowLooper.runUiThreadTasksIncludingDelayedTasks();

Usage example:

public class MainActivity extends AppCompatActivity {
    ........

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

Test arount it:

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



回答2:


You can try:

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

or, if you just was the runnable to be called:

Robolectric.runUiThreadTasksIncludingDelayedTasks();



回答3:


In Robolectric 3.0, IuriiO's answer would translate to-

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


来源:https://stackoverflow.com/questions/24642049/android-testing-handler-postdelayed

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!