正在测试的活动是一个简单的棋盘游戏。当满足游戏结束所需的条件时,在做了几件事以显示谁赢了之后,运行以下代码:
// Return to main menu after 5 seconds
Handler h = new Handler();
h.postDelayed(new Runnable() {
@Override
public void run() {
finish();
}
}, 5000);
我有一个使用ActivityInstrumentationTestCase2
的仪器测试。我可以制造它,以便测试从电路板开始,远离上面的代码被调用。但是在做完这个动作之后我怎么能断言finish()
被调用了?
我尝试使用ActivityUnitTestCase
isFinishCalled()
方法重复此测试,但我还没有能够使其正常工作。
答案 0 :(得分:2)
我有2个可能解决此问题的方法:
使用Robolectric框架将测试重写为单元测试:
setTimeout
然后测试看起来像:
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());
}
}
:
Handler
然后测试看起来像:
public class MainActivity extends AppCompatActivity {
........
public void finishGame(boolean postDelayed) {
if (postDelayed) {
Handler h = new Handler();
h.postDelayed(new Runnable() {
@Override
public void run() {
finish();
}
}, 5000);
return;
}
finish();
}
}
在生产代码中,您将此方法称为public class MainActivityTest extends ActivityTestCase {
public MainActivityTest() {
super();
setActivity(new MainActivity());
}
public void testFinishing() {
assertFalse(getActivity().isFinishing());
((MainActivity)getActivity()).finishGame(false);
assertTrue(getActivity().isFinishing());
}
}
。
在我的项目中,我坚持使用第二个选项(在我的情况下,我正在测试finishGame(true)
的行为,同时还需要延迟以确保正确构建视图)
我希望,这有帮助