Flutter集成测试中sqflite的openDatabase无法完成执行怎么办?
解决Flutter集成测试中sqflite的openDatabase阻塞问题
问题原因
在Flutter widget测试/集成测试环境下,原生sqflite依赖Android/iOS的原生数据库驱动,而测试环境没有完整的原生支持,导致openDatabase调用阻塞无法完成。
解决方案
使用sqflite_common_ffi提供的纯Dart数据库实现适配测试环境,同时调整测试流程确保App初始化完成:
1. 添加测试依赖
在pubspec.yaml的dev_dependencies中添加:
dev_dependencies: sqflite_common_ffi: ^2.3.0
2. 修改测试代码
import 'package:flutter_test/flutter_test.dart'; import 'package:our_habits/my_app.dart'; import 'package:sqflite/sqflite.dart'; import 'package:sqflite_common_ffi/sqflite_ffi.dart'; void main() { setUpAll(() { // 初始化sqflite的FFI实现,适配测试环境 sqfliteFfiInit(); databaseFactory = databaseFactoryFfi; }); testWidgets("Test sqflite database", (WidgetTester tester) async { print("start"); // 加载App并等待所有异步初始化完成 await tester.pumpWidget(const MyApp()); await tester.pumpAndSettle(); print("pumpWidget is done"); final db = await openDatabase( inMemoryDatabasePath, version: 1, onCreate: (Database db, int version) async { // 若需创建表,确保这里的异步操作执行完成 // 示例:await db.execute('CREATE TABLE habits (id INTEGER PRIMARY KEY)'); }, ); // 测试完成后关闭数据库,避免资源泄漏 await db.close(); print("end"); }); }
关键调整点
- 初始化FFI实现:在测试启动时设置使用纯Dart的数据库工厂,绕过原生环境依赖。
- pumpAndSettle:等待App中所有异步操作(如内部数据库初始化)完成,避免测试中的数据库操作与App初始化冲突。
- 关闭数据库:测试结束后关闭数据库,防止后续测试出现资源占用问题。
内容的提问来源于stack exchange,提问作者Searene
相关产品推荐
相关产品推荐

