14

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

我已经在谷歌上搜索了几天,我尝试了很多东西,但根本没有结果。我尝试获取 UI 线程并等待它。我尝试让您的调度程序获取队列并查看那里是否有任何任务。但根本没有结果。

有什么建议可以让我的测试等到新的活动被触发?

谢谢

4

3 回答 3

34

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());
    }
}
于 2015-12-21T14:58:18.753 回答
9

你可以试试:

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

或者,如果您只是被调用的可运行对象:

Robolectric.runUiThreadTasksIncludingDelayedTasks();
于 2014-09-30T21:01:59.420 回答
3

在 Robolectric 3.0 中,IuriiO 的回答将转化为——

ShadowLooper.pauseMainLooper();
Robolectric.getForegroundThreadScheduler().advanceBy(intervalMs);
ShadowLooper.unPauseMainLooper();
于 2017-03-14T19:59:53.410 回答