在我的许多测试中,我的应用程序正在运行访问数据库的AsyncTasks
,无法取消。在我的测试结束时,我关闭我的数据库,删除它,然后重新打开它,所以我有一个新的数据库夹具。
问题是,当AsyncTasks
恰好在测试关闭和删除数据库期间仍在运行时,我将在代码中获得运行时异常。这在生产代码中永远不会发生,因为数据库永远不会在生产中关闭。
Robotium有一个名为finishOpenedActivities
的测试辅助方法,我在我的测试拆解方法中使用它。如果有一些方法可以修改finishOpenedActivities以确保所有子线程(特定于AsyncTasks)也已完成,那将非常有用。否则,为了支持可靠的测试,我可能不得不在所有AsyncTasks中取消实施检查。
是否有某种方法可以等到所有子线程(特定于AsyncTasks)完成?
答案 0 :(得分:1)
根据docs,有一种getStatus()
方法。您只需要引用AsyncTask
。
AsyncTask<Void, Void, Void> yourAsyncTask = new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... arg0) {
// your async code
return null;
}
};
if (yourAsyncTask.getStatus() == AsyncTask.Status.RUNNING) {
// What ever you need to do if still running ex.
yourAxyncTask.cancel();
}
答案 1 :(得分:0)
我最终回避了数据库问题,尽管这对于其他任何可能发现有用的工具都非常依赖于工具。我还使用OrmLite进行数据库访问,因此我在测试拆解方法中添加了逻辑,该方法使用PowerMock的Whitebox
反射来访问OrmLite的私有数据库instanceCount
变量。它会跟踪打开的数据库句柄数。我只是等到句柄数减少到1,然后我知道没有其他线程访问数据库。