Flutter Secure Storage单元测试Mock实现不生效问题排查
Flutter Secure Storage Mock 失效问题排查及修复
核心问题列表
- 问题1:Mock实例未注入到测试目标类
SecureStorage中
你创建的MockFlutterSecureStorage实例是独立的,没有替换SecureStorage内部依赖的FlutterSecureStorage实例,导致SecureStorage运行时还是调用真实的存储类,Mock规则完全不生效。 - 问题2:Mock规则定义与测试方法调用逻辑颠倒
你把待测试的storage.saveAccessToken方法放到了when().thenAnswer()的回调内部,逻辑完全错位:thenAnswer是用来定义Mock方法被调用时的返回行为,应该先定义好Mock规则,再调用待测试的业务方法。 - 问题3:缺少对应读操作的Mock规则(适用于
SecureStorage.accessToken从存储读取的场景)
如果accessToken的getter是调用FlutterSecureStorage.read方法读取存储值,你还需要额外Mockread方法的返回值,否则expect取值时也会拿不到预期结果。 - 问题4:异步操作未正确等待,存在语法错误
原代码中saveAccessToken是异步方法,调用时没有加await,同时thenAnswer内部的语法写法错误,会直接导致编译/运行失败。
修复方案
第一步:改造SecureStorage支持依赖注入
class SecureStorage { final FlutterSecureStorage _storage; // 构造函数支持传入mock实例,默认使用真实存储实例 SecureStorage({FlutterSecureStorage? storage}) : _storage = storage ?? FlutterSecureStorage(); Future<void> saveAccessToken(String token) async { await _storage.write(key: 'accessToken', value: token); } Future<String?> get accessToken async { return await _storage.read(key: 'accessToken'); } }
第二步:修正测试代码
@GenerateMocks([FlutterSecureStorage]) void main() { group('#accessToken', () { test('Save accessToken in a storage', () async { final mockFlutterSecureStorage = MockFlutterSecureStorage(); const accessToken = 'a1'; // 将mock实例注入到SecureStorage中 final storage = SecureStorage(storage: mockFlutterSecureStorage); // 先定义mock write方法的调用规则 when(mockFlutterSecureStorage.write( key: 'accessToken', value: accessToken, )).thenAnswer((_) async => {}); // 定义mock read方法的调用规则,用于后续取值校验 when(mockFlutterSecureStorage.read(key: 'accessToken')) .thenAnswer((_) async => accessToken); // 调用待测试的存储方法 await storage.saveAccessToken(accessToken); // 校验结果 expect(await storage.accessToken, accessToken); // 可选校验:确认mock的write方法确实被调用了1次 verify(mockFlutterSecureStorage.write( key: 'accessToken', value: accessToken, )).called(1); }); }); }
内容的提问来源于stack exchange,提问作者Michael Karp
相关产品推荐
相关产品推荐

