3

在我的许多测试中,我的应用程序正在运行AsyncTasks访问数据库并且无法取消。在我的测试结束时,我关闭我的数据库,删除它,然后重新打开它,这样我就有了一个新的数据库装置。

问题是,当AsyncTasks测试关闭和删除数据库期间碰巧仍在运行时,我将在代码中得到运行时异常。这在生产代码中永远不会发生,因为数据库在生产中永远不会关闭。

Robotium 有一个测试辅助方法finishOpenedActivities,我在我的测试拆解方法中使用它。如果有某种方法可以修改 finishOpenedActivities 以确保所有子线程(特别是 AsyncTasks)也完成,那将非常有帮助。否则,我可能不得不在我的所有 AsyncTasks 中执行取消检查,以支持可靠的测试。

是否有某种方法可以等到所有子线程(特别是 AsyncTasks)完成?

4

2 回答 2

1

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();
}
于 2012-08-23T15:12:08.290 回答
0

我最终回避了数据库问题,尽管这对于其他任何人都可能觉得有用的工具非常依赖。我还使用 OrmLite 进行数据库访问,因此我在测试拆卸方法中添加了逻辑,该方法通过 PowerMock 使用反射Whitebox来访问 OrmLite 的私有数据库instanceCount变量。它跟踪打开了多少数据库句柄。我只是等到句柄计数下降到一,然后我知道没有其他线程访问数据库。

于 2012-08-23T15:30:58.517 回答