You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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方法读取存储值,你还需要额外Mock read方法的返回值,否则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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 11:33:03