我正在尝试为应用程序编写一些Activity测试,我要测试的一个特定方案是,当我单击某个按钮时,Activity视图会相应地更新。但是,单击该按钮会导致启动稍长时间的异步任务,并且只有在该任务完成后,视图才会更改。
我该如何测试?我目前正在尝试使用ActivityInstrumentationTestCase2类来完成此任务,但是在按钮单击任务的异步部分完成并且视图更新之前,我无法确定如何让测试“等待”。
答案 0 :(得分:3)
最常见也是最简单的解决方案是使用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());
}
希望这有帮助。
答案 1 :(得分:0)
如果您正在使用Eclipse,则可以通过在更新视图的代码中设置断点来使用调试器。您还可以在长时间运行的任务中设置一些断点,以确保所有代码都在执行。
另一种方法是,在长时间运行的任务和视图更新程序代码中写入一些日志或控制台输出,这样您就可以在不中断调试器线程的情况下查看进度。
作为一个建议,如果它是一个长期运行的过程,你应该向用户显示一些描述的进度条,所以他们不会卡在那里思考“是否发生了什么?”。如果您使用具有最大值的进度条,则可以在长时间运行的任务中更新它,以便用户可以看到活动从10%到20%......等等。
很抱歉,如果您期待某种特定于jUnit的答案。
答案 2 :(得分:0)
我最终通过使用Robotium库的Solo.waitForText方法解决了这个问题,该方法接受字符串和超时时间并阻塞,直到出现预期文本或发生超时。伟大的UI测试库。