我在JUnit4中遇到了我的活动的单元测试问题。该应用程序是一款游戏,所以主要的游戏活动相当复杂。我想测试一旦启动和取消暂停(默认情况下它以暂停模式启动)游戏运行5秒而不会崩溃。我认为这是一个过时的运行。
活动的onCreate
在单独的线程中做了一些相对繁重的工作,我需要等待,直到它完成为止。下面的代码说明了测试用例。
@RunWith(AndroidJUnit4.class)
public class GameTest {
@Rule
public ActivityTestRule<GameActivity> mActivityRule =
new ActivityTestRule<>(GameActivity.class, true, false);
@Before
public void launchActivity() throws Throwable {
Intent intent = new Intent();
/* ... skipped building intent ... */
mActivityRule.launchActivity(intent);
// wait till the constructors finish
while (!mActivityRule.getActivity().gameLoopStarted) {
Thread.sleep(10);
}
}
@Test
public void gameRunsFor5sec() throws Throwable {
mActivityRule.runOnUiThread(new Runnable() {
@Override
public void run() {
// unpause
mActivityRule.getActivity().playPause(null);
}
});
Time t = Time.getCurrent();
// wait 5 secs before considering the test passed
while (Time.getCurrent().since(t).getMillis() < 5000) { }
}
}
我遇到的问题是测试总是在Android Studio的debug
模式下通过,无法在run
模式下正常启动;在debug
中,加载活动需要大约100-200ms(Thread.sleep循环),游戏取消暂停,5秒后测试结束。在run
中,游戏的加载方式与debug
相同,但随后不会暂停,并且测试在45秒后超时。例如,该活动完全起作用,可以手动取消模拟器上的游戏并播放。我以前尝试过不同的方法,比如静态5秒而不是检查gameLoopStarted标志,但结果是一样的。