我正在尝试为应用程序编写一些活动测试,我想测试的一个特定场景是,当我单击某个按钮时,活动视图会相应更新。但是,单击该按钮会导致一个运行时间较长的异步任务启动,并且只有在该任务完成后视图才会更改。
我该如何测试呢?我目前正在尝试使用 ActivityInstrumentationTestCase2 类来完成此操作,但无法弄清楚如何让测试“等待”直到按钮单击任务的异步部分完成并且视图更新。
最常见和最简单的解决方案是使用Thread.sleep()
:
public void testFoo() {
TextView textView = (TextView) myActivity.findViewById(com.company.app.R.id.text);
assertEquals("text should be empty", "", textView.getText());
// simulate a button click, which start an AsyncTask and update TextView when done.
final Button button = (Button) myActivity.findViewById(com.company.app.R.id.refresh);
myActivity.runOnUiThread(new Runnable() {
public void run() {
button.performClick();
}
});
// assume AsyncTask will be finished in 6 seconds.
try {
Thread.sleep(6000);
} catch (InterruptedException e) {
e.printStackTrace();
}
assertEquals("text should be refreshed", "refreshed", textView.getText());
}
希望这可以帮助。
如果您使用的是 Eclipse,则可以通过在更新视图的代码中设置断点来使用调试器。您还可以在长时间运行的任务中设置一些断点来观察并确保所有代码都在执行。
另一种方法是在长时间运行的任务和视图更新程序代码中编写一些日志或控制台输出,这样您就可以在不中断调试器线程的情况下查看进度。
作为一条建议,如果它是一个长期运行的过程,您应该向用户显示一些描述的进度条,这样他们就不会被困在那里思考“发生了什么事情吗?”。如果您使用具有最大值的进度条,您可以在长时间运行的任务中更新它,以便用户可以看到活动从 10% 变为 20% ......等等。
抱歉,如果您期待某种特定于 jUnit 的答案。
我最终通过使用Robotium库的 Solo.waitForText 方法解决了这个问题,该方法采用字符串和超时时间并阻塞,直到出现预期的文本或发生超时。很棒的 UI 测试库。