安卓测试 Handler.postDelayed

17

我是Android的新手,在测试启动屏时遇到了问题,基本上我正在尝试测试启动屏停留3秒钟。这是启动屏的代码:

@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进行测试。

我已经谷歌搜索了几天,尝试了很多方法,但完全没有结果。我试图获取UI线程并等待它。我尝试使用调度程序获取队列并查看是否有任何任务。但完全没有结果。

有什么建议可以让我的测试等待直到新的Activity被触发吗?

谢谢

3个回答

37

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

非常好的答案,runUiThreadTasksIncludingDelayedTasks 直接就能用了,谢谢。 - user1228891

10

您可以尝试以下操作:

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

或者,如果您只是希望调用可运行的程序:

Robolectric.runUiThreadTasksIncludingDelayedTasks();

谢谢帮助,我稍后会检查! - Rabel
现在你需要使用ShadowLooper.runUiThreadTasksIncludingDelayedTasks而不是Robolectric。我正在使用版本4.4的robolectric。 - Falcon

3
在Robolectric 3.0中,IuriiO的答案将会被翻译成-
ShadowLooper.pauseMainLooper();
Robolectric.getForegroundThreadScheduler().advanceBy(intervalMs);
ShadowLooper.unPauseMainLooper();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接